unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* specific coloring of diary calendar entries
@ 2002-12-11 23:58 Ami Fischman
  2002-12-12  1:02 ` Alan Shutko
  2002-12-13 22:22 ` Richard Stallman
  0 siblings, 2 replies; 24+ messages in thread
From: Ami Fischman @ 2002-12-11 23:58 UTC (permalink / raw)


[-- Attachment #1: Type: text/plain, Size: 2114 bytes --]

[apologies if this appears twice; attempted posting two days ago, but the
 post never appeared on the list]

Attached are two patches that make it possible to specify a color for a
diary entry in the entry itself.  This is done via "color tags" -- a string
that looks like "[color:blue]" (without the quotes, and blue can be any
standard X color).  This color comes out both in the calendar display
(dates are colored according to the events in them) and in the fancy diary
display (entries are colored according to their specifications).

The first entry matching a date is the one that determines the color for
that date (so order DOES matter in ~/.diary files now).  The color tag MUST
appear at the end of a line (nothing other than a newline may follow it),
and if one has a multi-line non-sexp entry, the color tag may appear on the
first line of the entry.  On multi-line sexp entries, the color tag may
appear on any line in the sexp, at the end of the line.

To tag all entries that don't have their own color tags, one may have a
"global file color" specified: the first line in a file consisting of the
string "# [color:lightgrey]" (without the double quotes) determines the
color, and the entries in that file will default to that color.

If a date matches more than one entry, the FIRST matching entry's color is
used for the date.  Regular entries get marked before sexp ones, so their
colors always show up instead of sexp ones (which jives with the notion
that sexp events are "generic" whereas regular entries are "specific" and
so more attention-deserving).

This solves a long-time wish of mine to be able to give "subtler" colors to
less important events and glaring colors to events that demand my attention.
It also solves a request of Kai Grossjohann for #include'd entry coloring,
and hopefully makes diary/calendar modes a more attractive alternative for
group-wide #include'd diary files.

If there are no objections to the code (there may be; my lisp is very
rusty), I'd like to see it committed to CVS.  Any comments happily accepted.

Cheers,
-- 
  Ami Fischman
  usenet@fischman.org


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: col-cal.patch --]
[-- Type: text/x-patch, Size: 2196 bytes --]

*** calendar.el	2002-12-09 16:14:14.000000000 -0800
--- /usr/local/emacs/share/emacs/21.2.50/lisp/calendar/calendar.el	2002-04-16 15:10:10.000000000 -0700
***************
*** 2507,2536 ****
     (= (extract-calendar-year date1) (extract-calendar-year date2))))
  
  (defun mark-visible-calendar-date (date &optional mark)
    "Mark DATE in the calendar window with MARK.
! MARK is either a single-character string, a color-name string (such as \"green\"), or a face.
  MARK defaults to diary-entry-marker."
    (if (calendar-date-is-legal-p date)
        (save-excursion
          (set-buffer calendar-buffer)
          (calendar-cursor-to-visible-date date)
!         (let ((mark (or (and (stringp mark) (> (length mark) 0) mark)
! 			(and (not (stringp mark)) mark)
! 			diary-entry-marker)))
            (if (stringp mark)
! 	      (if (= (length mark) 1)
! 		  (let ((buffer-read-only nil))
! 		    (forward-char 1)
! 		    (delete-char 1)
! 		    (insert mark)
! 		    (forward-char -2))
! 		(progn
! 		  (setq temp-face (make-symbol (concat "cal-col-face-" mark)))
! 		  (make-face temp-face)
! 		  (set-face-foreground temp-face mark)
! 		  (overlay-put
! 		   (make-overlay (1- (point)) (1+ (point))) 'face temp-face)))
  	    (overlay-put
               (make-overlay (1- (point)) (1+ (point))) 'face mark))))))
  
  (defun calendar-star-date ()
--- 2507,2527 ----
     (= (extract-calendar-year date1) (extract-calendar-year date2))))
  
  (defun mark-visible-calendar-date (date &optional mark)
    "Mark DATE in the calendar window with MARK.
! MARK is either a single-character string or a face.
  MARK defaults to diary-entry-marker."
    (if (calendar-date-is-legal-p date)
        (save-excursion
          (set-buffer calendar-buffer)
          (calendar-cursor-to-visible-date date)
!         (let ((mark (or mark diary-entry-marker)))
            (if (stringp mark)
!               (let ((buffer-read-only nil))
!                 (forward-char 1)
!                 (delete-char 1)
!                 (insert mark)
!                 (forward-char -2))
  	    (overlay-put
               (make-overlay (1- (point)) (1+ (point))) 'face mark))))))
  
  (defun calendar-star-date ()

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: col-dia.patch --]
[-- Type: text/x-patch, Size: 18776 bytes --]

*** diary-lib.el	2002-12-10 09:16:11.000000000 -0800
--- /usr/local/emacs/share/emacs/21.2.50/lisp/calendar/diary-lib.el	2002-08-28 08:16:15.000000000 -0700
***************
*** 246,261 ****
  		(set-buffer (find-file-noselect d-file t))
  	      (set-buffer diary-buffer)
  	      (or (verify-visited-file-modtime diary-buffer)
  		  (revert-buffer t t))))
- 	  ;; AMI -- Figure out the file-glob-color
- 	  (setq file-glob-color "")
- 	  (save-excursion
- 	    (goto-char (point-min))
- 	    (if (re-search-forward "^#[ \t]*\\[color:\\([a-z]+\\)\\]$" (point-max) t)
- 		(setq file-glob-color (buffer-substring-no-properties
- 				       (match-beginning 1)
- 				       (match-end 1)))))
            (setq selective-display t)
            (setq selective-display-ellipses nil)
            (setq old-diary-syntax-table (syntax-table))
            (set-syntax-table diary-syntax-table)
--- 246,253 ----
***************
*** 334,349 ****
                                date
                                (buffer-substring
                                 entry-start (point))
                                (buffer-substring
!                                (1+ date-start) (1- entry-start)) file-glob-color)))))
                       (setq d (cdr d)))
                     (or entry-found
                         (not diary-list-include-blanks)
                         (setq diary-entries-list
                               (append diary-entries-list
! 				     ;; AMI -- added a fourth element to a diary-entries-list element
!                                      (list (list date "" "" "")))))
                     (setq date
                           (calendar-gregorian-from-absolute
                             (1+ (calendar-absolute-from-gregorian date))))
                     (setq entry-found nil)))
--- 326,340 ----
                                date
                                (buffer-substring
                                 entry-start (point))
                                (buffer-substring
!                                (1+ date-start) (1- entry-start)))))))
                       (setq d (cdr d)))
                     (or entry-found
                         (not diary-list-include-blanks)
                         (setq diary-entries-list
                               (append diary-entries-list
!                                      (list (list date "" "")))))
                     (setq date
                           (calendar-gregorian-from-absolute
                             (1+ (calendar-absolute-from-gregorian date))))
                     (setq entry-found nil)))
***************
*** 518,548 ****
  					 x)
                                         date-holiday-list
                                         (concat "\n" (make-string l ? ))))
                      (insert ?\n (make-string (+ l longest) ?=) ?\n)))))
! 	  (setq entry (car (cdr (car entry-list))))
!           (if (< 0 (length entry))
! 	      (progn
! 		(insert entry ?\n)
! 		;; AMI -- pick off the color that was the global file color for this entry when it was read in
! 		(setq file-glob-color (fourth (car entry-list)))
! 		;; AMI - find color for this diary entry if one is present
! 		(setq color file-glob-color)
! 		(save-excursion
! 		  (if (string-match "\\[color:\\([a-z]+\\)\\]$" entry)
! 		      (setq color (substring-no-properties entry
! 							   (match-beginning 1)
! 							   (match-end 1))))
! 		  (if (not (string= color ""))
! 		      (progn
! 			(search-backward entry)
! 			(setq temp-face (make-symbol (concat "cal-col-face-" color)))
! 			(make-face temp-face)
! 			(set-face-foreground temp-face color)
! 			(overlay-put
! 			 (make-overlay (match-beginning 0) (match-end 0)) 'face temp-face)))
! 		    )))
! 	  (setq entry-list (cdr entry-list))))
        (set-buffer-modified-p nil)
        (goto-char (point-min))
        (setq buffer-read-only t)
        (display-buffer fancy-diary-buffer)
--- 509,519 ----
  					 x)
                                         date-holiday-list
                                         (concat "\n" (make-string l ? ))))
                      (insert ?\n (make-string (+ l longest) ?=) ?\n)))))
!           (if (< 0 (length (car (cdr (car entry-list)))))
!               (insert (car (cdr (car entry-list))) ?\n))
!           (setq entry-list (cdr entry-list))))
        (set-buffer-modified-p nil)
        (goto-char (point-min))
        (setq buffer-read-only t)
        (display-buffer fancy-diary-buffer)
***************
*** 664,674 ****
  0 1 * * * diary-rem.sh
  to run it every morning at 1am."
    (interactive "P")
    (let* ((diary-display-hook 'fancy-diary-display)
! ; AMI
! ; Do this so that I have a chance to NOT include blanks in the email
! ;         (diary-list-include-blanks t)
           (text (progn (list-diary-entries (calendar-current-date)
                                            (if ndays ndays diary-mail-days))
                        (set-buffer fancy-diary-buffer)
                        (buffer-substring (point-min) (point-max)))))
--- 635,643 ----
  0 1 * * * diary-rem.sh
  to run it every morning at 1am."
    (interactive "P")
    (let* ((diary-display-hook 'fancy-diary-display)
!          (diary-list-include-blanks t)
           (text (progn (list-diary-entries (calendar-current-date)
                                            (if ndays ndays diary-mail-days))
                        (set-buffer fancy-diary-buffer)
                        (buffer-substring (point-min) (point-max)))))
***************
*** 719,734 ****
          (if (file-readable-p d-file)
              (save-excursion
                (message "Marking diary entries...")
                (set-buffer (find-file-noselect d-file t))
- 	      ;; AMI - find global color for this file
- 	      (setq file-glob-color "")
- 	      (save-excursion
- 		(goto-char (point-min))
- 		(if (re-search-forward "^#[ \t]*\\[color:\\([a-z]+\\)\\]$" (point-max) t)
- 		    (setq file-glob-color (buffer-substring-no-properties
- 					   (match-beginning 1)
- 					   (match-end 1)))))
                (let ((d diary-date-forms)
                      (old-diary-syntax-table))
                  (setq old-diary-syntax-table (syntax-table))
                  (set-syntax-table diary-syntax-table)
--- 688,695 ----
***************
*** 805,827 ****
                                             (if (> (- current-y y) 50)
                                                 (+ y 100)
                                               y)))
                                       (string-to-int y-str)))))
- 			;; AMI - find color for this diary entry
- 			(setq color file-glob-color)
- 			(save-excursion
- 			  (if (re-search-forward "\\[color:\\([a-z]+\\)\\]$" (line-end-position) t)
- 			      (setq color (buffer-substring-no-properties
- 					   (match-beginning 1)
- 					   (match-end 1)))))
                          (if dd-name
                              (mark-calendar-days-named
                               (cdr (assoc-ignore-case
                                     (substring dd-name 0 3)
                                     (calendar-make-alist
                                      calendar-day-name-array
                                      0
!                                     (lambda (x) (substring x 0 3))))) color)
                            (if mm-name
                                (if (string-equal mm-name "*")
                                    (setq mm 0)
                                  (setq mm
--- 766,781 ----
                                             (if (> (- current-y y) 50)
                                                 (+ y 100)
                                               y)))
                                       (string-to-int y-str)))))
                          (if dd-name
                              (mark-calendar-days-named
                               (cdr (assoc-ignore-case
                                     (substring dd-name 0 3)
                                     (calendar-make-alist
                                      calendar-day-name-array
                                      0
!                                     (lambda (x) (substring x 0 3))))))
                            (if mm-name
                                (if (string-equal mm-name "*")
                                    (setq mm 0)
                                  (setq mm
***************
*** 831,839 ****
                                               calendar-month-name-array
                                               1
                                               (lambda (x) (substring x 0 3)))
                                              )))))
!                           (mark-calendar-date-pattern mm dd yy color))))
                      (setq d (cdr d))))
                  (mark-sexp-diary-entries)
                  (run-hooks 'nongregorian-diary-marking-hook
                             'mark-diary-entries-hook)
--- 785,793 ----
                                               calendar-month-name-array
                                               1
                                               (lambda (x) (substring x 0 3)))
                                              )))))
!                           (mark-calendar-date-pattern mm dd yy))))
                      (setq d (cdr d))))
                  (mark-sexp-diary-entries)
                  (run-hooks 'nongregorian-diary-marking-hook
                             'mark-diary-entries-hook)
***************
*** 887,895 ****
                       (char-equal (preceding-char) ?\n))
                   (not (looking-at " \\|\^I")))
              (progn;; Diary entry consists only of the sexp
                (backward-char 1)
!               (setq entry "" color nil))
            (setq entry-start (point))
            ;; Find end of entry
            (re-search-forward "\^M\\|\n" nil t)
            (while (looking-at " \\|\^I")
--- 841,849 ----
                       (char-equal (preceding-char) ?\n))
                   (not (looking-at " \\|\^I")))
              (progn;; Diary entry consists only of the sexp
                (backward-char 1)
!               (setq entry ""))
            (setq entry-start (point))
            ;; Find end of entry
            (re-search-forward "\^M\\|\n" nil t)
            (while (looking-at " \\|\^I")
***************
*** 903,920 ****
              (aset entry (match-beginning 0) ?\n )))
          (calendar-for-loop date from first-date to last-date do
            (if (diary-sexp-entry sexp entry
                                  (calendar-gregorian-from-absolute date))
! 	      ;; AMI - find color for this diary entry
! 	      (progn
! 		(setq color "")
! 		(save-excursion
! 		  (if (string-match "\\[color:\\([a-z]+\\)\\]$" entry)
! 		      (setq color (substring-no-properties entry
! 				   (match-beginning 1)
! 				   (match-end 1)))))
! 		(mark-visible-calendar-date
! 		 (calendar-gregorian-from-absolute date) color))))))))
  
  (defun mark-included-diary-files ()
    "Mark the diary entries from other diary files with those of the diary file.
  This function is suitable for use as the `mark-diary-entries-hook'; it enables
--- 857,866 ----
              (aset entry (match-beginning 0) ?\n )))
          (calendar-for-loop date from first-date to last-date do
            (if (diary-sexp-entry sexp entry
                                  (calendar-gregorian-from-absolute date))
!               (mark-visible-calendar-date
!                (calendar-gregorian-from-absolute date))))))))
  
  (defun mark-included-diary-files ()
    "Mark the diary entries from other diary files with those of the diary file.
  This function is suitable for use as the `mark-diary-entries-hook'; it enables
***************
*** 947,955 ****
          (message "Can't find included diary file %s" diary-file)
          (sleep-for 2))))
    (goto-char (point-min)))
  
! (defun mark-calendar-days-named (dayname color)
    "Mark all dates in the calendar window that are day DAYNAME of the week.
  0 means all Sundays, 1 means all Mondays, and so on."
    (save-excursion
      (set-buffer calendar-buffer)
--- 893,901 ----
          (message "Can't find included diary file %s" diary-file)
          (sleep-for 2))))
    (goto-char (point-min)))
  
! (defun mark-calendar-days-named (dayname)
    "Mark all dates in the calendar window that are day DAYNAME of the week.
  0 means all Sundays, 1 means all Mondays, and so on."
    (save-excursion
      (set-buffer calendar-buffer)
***************
*** 965,989 ****
                   (calendar-nth-named-day 1 dayname prev-month prev-year)))
        (setq last-day (calendar-absolute-from-gregorian
                   (calendar-nth-named-day -1 dayname succ-month succ-year)))
        (while (<= day last-day)
!         (mark-visible-calendar-date (calendar-gregorian-from-absolute day) color)
          (setq day (+ day 7))))))
  
! (defun mark-calendar-date-pattern (month day year color)
    "Mark all dates in the calendar window that conform to MONTH/DAY/YEAR.
  A value of 0 in any position is a wildcard."
    (save-excursion
      (set-buffer calendar-buffer)
      (let ((m displayed-month)
            (y displayed-year))
        (increment-calendar-month m y -1)
        (calendar-for-loop i from 0 to 2 do
!           (mark-calendar-month m y month day year color)
            (increment-calendar-month m y 1)))))
  
! 
! (defun mark-calendar-month (month year p-month p-day p-year color)
    "Mark dates in the MONTH/YEAR that conform to pattern P-MONTH/P_DAY/P-YEAR.
  A value of 0 in any position of the pattern is a wildcard."
    (if (or (and (= month p-month)
                 (or (= p-year 0) (= year p-year)))
--- 911,934 ----
                   (calendar-nth-named-day 1 dayname prev-month prev-year)))
        (setq last-day (calendar-absolute-from-gregorian
                   (calendar-nth-named-day -1 dayname succ-month succ-year)))
        (while (<= day last-day)
!         (mark-visible-calendar-date (calendar-gregorian-from-absolute day))
          (setq day (+ day 7))))))
  
! (defun mark-calendar-date-pattern (month day year)
    "Mark all dates in the calendar window that conform to MONTH/DAY/YEAR.
  A value of 0 in any position is a wildcard."
    (save-excursion
      (set-buffer calendar-buffer)
      (let ((m displayed-month)
            (y displayed-year))
        (increment-calendar-month m y -1)
        (calendar-for-loop i from 0 to 2 do
!           (mark-calendar-month m y month day year)
            (increment-calendar-month m y 1)))))
  
! (defun mark-calendar-month (month year p-month p-day p-year)
    "Mark dates in the MONTH/YEAR that conform to pattern P-MONTH/P_DAY/P-YEAR.
  A value of 0 in any position of the pattern is a wildcard."
    (if (or (and (= month p-month)
                 (or (= p-year 0) (= year p-year)))
***************
*** 991,1000 ****
                 (or (= p-year 0) (= year p-year))))
        (if (= p-day 0)
            (calendar-for-loop
                i from 1 to (calendar-last-day-of-month month year) do
!             (mark-visible-calendar-date (list month i year) color))
!         (mark-visible-calendar-date (list month p-day year) color))))
  
  (defun sort-diary-entries ()
    "Sort the list of diary entries by time of day."
    (setq diary-entries-list (sort diary-entries-list 'diary-entry-compare)))
--- 936,945 ----
                 (or (= p-year 0) (= year p-year))))
        (if (= p-day 0)
            (calendar-for-loop
                i from 1 to (calendar-last-day-of-month month year) do
!             (mark-visible-calendar-date (list month i year)))
!         (mark-visible-calendar-date (list month p-day year)))))
  
  (defun sort-diary-entries ()
    "Sort the list of diary entries by time of day."
    (setq diary-entries-list (sort diary-entries-list 'diary-entry-compare)))
***************
*** 1205,1217 ****
           (sexp-mark (regexp-quote sexp-diary-entry-symbol))
           (s-entry (concat "\\(\\`\\|\^M\\|\n\\)" mark "?" sexp-mark "("))
           (entry-found))
      (goto-char (point-min))
-     (save-excursion
-       (if (re-search-forward "^#[ \t]*\\[color:\\([a-z]+\\)\\]$" (point-max) t)
- 	  (setq file-glob-color (buffer-substring-no-properties
- 				 (match-beginning 1)
- 				 (match-end 1)))))
      (while (re-search-forward s-entry nil t)
        (backward-char 1)
        (let ((sexp-start (point))
              (sexp)
--- 1150,1157 ----
***************
*** 1243,1251 ****
              (aset entry (match-beginning 0) ?\n )))
          (let ((diary-entry (diary-sexp-entry sexp entry date)))
            (if diary-entry
                (subst-char-in-region line-start (point) ?\^M ?\n t))
!           (add-to-diary-list date diary-entry specifier file-glob-color)
            (setq entry-found (or entry-found diary-entry)))))
      entry-found))
  
  (defun diary-sexp-entry (sexp entry date)
--- 1183,1191 ----
              (aset entry (match-beginning 0) ?\n )))
          (let ((diary-entry (diary-sexp-entry sexp entry date)))
            (if diary-entry
                (subst-char-in-region line-start (point) ?\^M ?\n t))
!           (add-to-diary-list date diary-entry specifier)
            (setq entry-found (or entry-found diary-entry)))))
      entry-found))
  
  (defun diary-sexp-entry (sexp entry date)
***************
*** 1486,1499 ****
       ((and (listp days) days)
        (or (diary-remind sexp (car days) marking)
            (diary-remind sexp (cdr days) marking))))))
  
! (defun add-to-diary-list (date string specifier globcolor)
!   "Add the entry (DATE STRING SPECIFIER GLOBCOLOR) to `diary-entries-list'.
  Do nothing if DATE or STRING is nil."
    (and date string
         (setq diary-entries-list
!              (append diary-entries-list (list (list date string specifier globcolor))))))
  
  (defun make-diary-entry (string &optional nonmarking file)
    "Insert a diary entry STRING which may be NONMARKING in FILE.
  If omitted, NONMARKING defaults to nil and FILE defaults to diary-file."
--- 1426,1439 ----
       ((and (listp days) days)
        (or (diary-remind sexp (car days) marking)
            (diary-remind sexp (cdr days) marking))))))
  
! (defun add-to-diary-list (date string specifier)
!   "Add the entry (DATE STRING SPECIFIER) to `diary-entries-list'.
  Do nothing if DATE or STRING is nil."
    (and date string
         (setq diary-entries-list
!              (append diary-entries-list (list (list date string specifier))))))
  
  (defun make-diary-entry (string &optional nonmarking file)
    "Insert a diary entry STRING which may be NONMARKING in FILE.
  If omitted, NONMARKING defaults to nil and FILE defaults to diary-file."

[-- Attachment #4: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://mail.gnu.org/mailman/listinfo/emacs-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-11 23:58 specific coloring of diary calendar entries Ami Fischman
@ 2002-12-12  1:02 ` Alan Shutko
  2002-12-12 18:24   ` Ami Fischman
  2002-12-13 22:22 ` Richard Stallman
  1 sibling, 1 reply; 24+ messages in thread
From: Alan Shutko @ 2002-12-12  1:02 UTC (permalink / raw)
  Cc: emacs-devel

Ami Fischman <usenet@fischman.org> writes:

> Attached are two patches that make it possible to specify a color for a
> diary entry in the entry itself.

First, some general comments.  Your diff is reversed.  Next time,
specify the files in the opposite order: old file first, new file
next.

Second, those files have changes a bit since the version you're
looking at.  You should update to the latest CVS and redo your changes
against it.  In particular, things have been changed to allow
specification of colors for sexp diary entries (currently, only in the
calendar display), and font-lock has been enabled.

The way the sexp entry coloration works is that you specify a face in
the sexp.  This lets you specify not only foreground color, but also
slants, under or overline, inverse video, background, etc.
Personally, I think it would be better if your feature did things the
same way.  That way, you could apply all the faces you find for a
day, not just the first.  If the different faces don't specify the
same attributes, the overlays will automatically combine them.

You added arguments to a number of functions, but you didn't change
other files that use them.  (For example, both
mark-calendar-days-named and add-to-diary-list are used in cal-hebrew
and cal-islam.)  Unless you absolutely have to, could you avoid making
incompatible changes to the interface?  Calendar has been around for
quite a while, and it's quite possible someone else is depending on
the behavior of the old functions.  If you need to add a parameter,
make it optional, and make sure the function works correctly if it's
not passed.

I don't think it's very helpful to have the file glob color in the
diary-entries-list.  Instead, I'd recommend putting the face that
should be used for that entry.  That way, appt.el won't have to
reparse things to display the right color/face in its popups.  So,
that means I suggest you parse out the entry color when reading the
entry, and remove that text before putting it into diary-entries-list.
That way, without changes appt.el will work, and it can eventually be
extended to use the colors.  Also, the sexp entries can place _their_
face into the same place and get the same display.

I'd disagree that sexps are necessarily less important than regular
entries, btw.  If you don't see your anniversary on the calendar because
the color to pick your kid up after school overrode it, you're in for
a heap of trouble....

I'm also not sure about the specific syntax in the diary file, but
I'd leave that decision to Ed Reingold.  (He's the maintainer of the
Calendar, and since I'm not sure he reads emacs-devel, I'm going to
forward your message to him after I send this one.)

Thanks for your work.  Coloring things in the fancy-diary-display was
on my todo list, and I do see a need to color regular entries.

-- 
Alan Shutko <ats@acm.org> - In a variety of flavors!
My opinions may have changed, but not the fact that I am right.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-12  1:02 ` Alan Shutko
@ 2002-12-12 18:24   ` Ami Fischman
  2002-12-12 18:56     ` Ami Fischman
                       ` (2 more replies)
  0 siblings, 3 replies; 24+ messages in thread
From: Ami Fischman @ 2002-12-12 18:24 UTC (permalink / raw)
  Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 3147 bytes --]

[missive contains replies to Alan Shutko, Ed Reingold; quotes are
attributed by initials]

Alan Shutko <ats@acm.org> writes:

AS> First, some general comments.  Your diff is reversed.  Next time,

Doh!  Sorry :)

AS> Second, those files have changes a bit since the version you're

True.  For some reason I was under the impression that the calendar mode
was frozen for a long time.  Not sure why I thought that.

AS> specification of colors for sexp diary entries (currently, only in the
AS> calendar display), and font-lock has been enabled.

Perty!

AS> The way the sexp entry coloration works is that you specify a face in
AS> the sexp.  This lets you specify not only foreground color, but also
AS> slants, under or overline, inverse video, background, etc.

Interesting.  I don't like this approach, because it forces the user of
calendar mode to define faces himself.  I know that for me, at least, it is
much more useful to just say "[color:green]" than to create a face dedicated
to having a green fg.  My new patches keep my approach (of just specifying a
fg color), but still use the sexp face marking if it is specified by the
user.

AS> You added arguments to a number of functions, but you didn't change
AS> other files that use them.  

Guilty as charged.  Meant to make the args &optional, but apparently
forgot.  Fixed now.

AS> I don't think it's very helpful to have the file glob color in the
AS> diary-entries-list.  

Hmm.  The reason I did it as I did, was that I wanted to keep a notion of
which file an entry came from.  I agree that re-parsing for the colors is
silly, so made the change you suggest.  

AS> I'd disagree that sexps are necessarily less important than regular
AS> entries, btw.  If you don't see your anniversary on the calendar because
AS> the color to pick your kid up after school overrode it, you're in for
AS> a heap of trouble....

I disagree.  An irritated spouse is much better than a kid stranded for
8 hours after school ;)  I refer you to one of the early episodes of
_Malcolm in the Middle_ for proof.
However, even if I wanted to change this, I don't think it would be an easy
change to make.  sexp's get parsed for completely separately from
non-sexp's, so it would require a priority system that I just don't think
is worth it.

Then Ed Reingold <reingold@emr.cs.iit.edu> wrote:

ER> I like the idea, but the characters used to set off the colors (square
ER> brackets and the colon) should be user-definable, just like the non-marking
ER> symbol, sexp-expression symbol, etc.  I often use square brackets and colons
ER> in my diary entries!

Good point.  Added defcustoms for diary-color-regexp and
diary-glob-file-color-regexp.

One other feature I added (at the request of Kai Grossjohann) is the
prefixing of diary entries with the filename from which they came.  This is
controlled by the defcustom diary-file-name-prefix which defaults to nil
since I don't like it :)

Please check out the attached patches (against current CVS, and in the
right order this time :)) and let me know of any comments, suggestions,
questions, or flames.

Cheers,
-- 
  Ami Fischman
  usenet@fischman.org


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: col-cal.patch --]
[-- Type: text/x-patch, Size: 3455 bytes --]

*** /home/fischman/cvs/emacs/lisp/calendar/calendar.el	2002-12-07 13:30:57.000000000 -0800
--- calendar.el	2002-12-12 09:57:10.000000000 -0800
***************
*** 496,503 ****
--- 496,520 ----
  See the documentation for the function `include-other-diary-files'."
    :type 'string
    :group 'diary)
  
+ (defcustom diary-glob-file-color-regexp "^#[ \t]*\\[color:\\([a-z]+\\)\\]$"
+   "*The regular expression that picks off the global file color for 
+ colored diary/calendar displays."
+   :type 'string
+   :group 'diary)
+ 
+ (defcustom diary-color-regexp "\\[color:\\([a-z]+\\)\\]$"
+   "*The regular expression that picks off the entry's color for 
+ colored diary/calendar displays."
+   :type 'string
+   :group 'diary)
+ 
+ (defcustom diary-file-name-prefix nil
+   "If non-nil then each entry in the diary list will be prefixed with the name of the file in which it was defined."
+   :type 'boolean
+   :group 'diary)
+ 
  ;;;###autoload
  (defcustom sexp-diary-entry-symbol "%%"
    "*The string used to indicate a sexp diary entry in `diary-file'.
  See the documentation for the function `list-sexp-diary-entries'."
***************
*** 2552,2574 ****
     (= (extract-calendar-year date1) (extract-calendar-year date2))))
  
  (defun mark-visible-calendar-date (date &optional mark)
    "Mark DATE in the calendar window with MARK.
! MARK is either a single-character string or a face.
  MARK defaults to `diary-entry-marker'."
    (if (calendar-date-is-legal-p date)
        (save-excursion
          (set-buffer calendar-buffer)
          (calendar-cursor-to-visible-date date)
!         (let ((mark (or mark diary-entry-marker)))
!           (if (stringp mark)
!               (let ((buffer-read-only nil))
!                 (forward-char 1)
!                 (delete-char 1)
!                 (insert mark)
!                 (forward-char -2))
! 	    (overlay-put
!              (make-overlay (1- (point)) (1+ (point))) 'face mark))))))
  
  (defun calendar-star-date ()
    "Replace the date under the cursor in the calendar window with asterisks.
  This function can be used with the `today-visible-calendar-hook' run after the
--- 2569,2600 ----
     (= (extract-calendar-year date1) (extract-calendar-year date2))))
  
  (defun mark-visible-calendar-date (date &optional mark)
    "Mark DATE in the calendar window with MARK.
! MARK is a single-character string, an x-color-name string, or a face.
  MARK defaults to `diary-entry-marker'."
    (if (calendar-date-is-legal-p date)
        (save-excursion
          (set-buffer calendar-buffer)
          (calendar-cursor-to-visible-date date)
! 	(let ((mark (or (and (stringp mark) (> (length mark) 0) mark)
! 			(and (not (stringp mark)) mark)
! 			diary-entry-marker)))
! 	  (if (stringp mark)
! 	      (if (= (length mark) 1)
! 		  (let ((buffer-read-only nil))
! 		    (forward-char 1)
! 		    (delete-char 1)
! 		    (insert mark)
! 		    (forward-char -2))
! 		(progn
! 		  (setq temp-face (make-symbol (concat "cal-col-face-" mark)))
! 		  (make-face temp-face)
! 		  (set-face-foreground temp-face mark)
! 		  (overlay-put
! 		   (make-overlay (1- (point)) (1+ (point))) 'face temp-face)))
!             (overlay-put
! 	     (make-overlay (1- (point)) (1+ (point))) 'face mark))))))
  
  (defun calendar-star-date ()
    "Replace the date under the cursor in the calendar window with asterisks.
  This function can be used with the `today-visible-calendar-hook' run after the

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: col-dia.patch --]
[-- Type: text/x-patch, Size: 19946 bytes --]

*** /home/fischman/cvs/emacs/lisp/calendar/diary-lib.el	2002-11-18 01:05:22.000000000 -0800
--- diary-lib.el	2002-12-12 09:58:25.000000000 -0800
***************
*** 232,239 ****
--- 232,247 ----
  		(set-buffer (find-file-noselect d-file t))
  	      (set-buffer diary-buffer)
  	      (or (verify-visited-file-modtime diary-buffer)
  		  (revert-buffer t t))))
+ 	  ;; AMI -- Figure out the file-glob-color
+ 	  (setq file-glob-color "")
+ 	  (save-excursion
+ 	    (goto-char (point-min))
+ 	    (if (re-search-forward diary-glob-file-color-regexp (point-max) t)
+ 		(setq file-glob-color (buffer-substring-no-properties
+ 				       (match-beginning 1)
+ 				       (match-end 1)))))
            (setq selective-display t)
            (setq selective-display-ellipses nil)
            (setq old-diary-syntax-table (syntax-table))
            (set-syntax-table diary-syntax-table)
***************
*** 307,327 ****
                                 (re-search-forward "\^M\\|\n" nil t))
                               (backward-char 1)
                               (subst-char-in-region date-start
                                  (point) ?\^M ?\n t)
                               (add-to-diary-list
                                date
!                               (buffer-substring
!                                entry-start (point))
                                (buffer-substring
                                 (1+ date-start) (1- entry-start))
! 			      (copy-marker entry-start))))))
                       (setq d (cdr d)))
                     (or entry-found
                         (not diary-list-include-blanks)
                         (setq diary-entries-list
                               (append diary-entries-list
!                                      (list (list date "" "")))))
                     (setq date
                           (calendar-gregorian-from-absolute
                             (1+ (calendar-absolute-from-gregorian date))))
                     (setq entry-found nil)))
--- 315,341 ----
                                 (re-search-forward "\^M\\|\n" nil t))
                               (backward-char 1)
                               (subst-char-in-region date-start
                                  (point) ?\^M ?\n t)
+ 			     (setq color file-glob-color)
+ 			     (setq entry (buffer-substring entry-start (point)))
+ 			     (save-excursion
+ 			       (if (string-match diary-color-regexp entry)
+ 				   (setq color (substring-no-properties entry
+ 									(match-beginning 1)
+ 									(match-end 1)))))
                               (add-to-diary-list
                                date
! 			      entry
                                (buffer-substring
                                 (1+ date-start) (1- entry-start))
! 			      (copy-marker entry-start) color)))))
                       (setq d (cdr d)))
                     (or entry-found
                         (not diary-list-include-blanks)
                         (setq diary-entries-list
                               (append diary-entries-list
!                                      (list (list date "" "" "" "")))))
                     (setq date
                           (calendar-gregorian-from-absolute
                             (1+ (calendar-absolute-from-gregorian date))))
                     (setq entry-found nil)))
***************
*** 512,526 ****
  					 x)
                                         date-holiday-list
                                         (concat "\n" (make-string l ? ))))
                      (insert ?\n (make-string (+ l longest) ?=) ?\n)))))
!           (if (< 0 (length (car (cdr (car entry-list)))))
! 	      (if (nth 3 (car entry-list))
! 		  (insert-button (concat (car (cdr (car entry-list))) "\n")
! 				 'marker (nth 3 (car entry-list))
! 				 :type 'diary-entry)
! 		(insert (car (cdr (car entry-list))) ?\n)))
!           (setq entry-list (cdr entry-list))))
        (set-buffer-modified-p nil)
        (goto-char (point-min))
        (setq buffer-read-only t)
        (display-buffer fancy-diary-buffer)
--- 526,558 ----
  					 x)
                                         date-holiday-list
                                         (concat "\n" (make-string l ? ))))
                      (insert ?\n (make-string (+ l longest) ?=) ?\n)))))
! 
! 	  (setq entry (car (cdr (car entry-list))))
! 	  (if (< 0 (length entry))
! 	      (progn
! 		(if (nth 3 (car entry-list))
! 		    (insert-button (concat entry "\n")
! 				   'marker (nth 3 (car entry-list))
! 				   :type 'diary-entry)
! 		  (insert entry ?\n))
! 		;; AMI -- pick off the color that was the global file 
! 		;;        color for this entry when it was read in
! ;		(setq file-glob-color (fifth (car entry-list)))
! 		;; AMI - find color for this diary entry if one is present
! 		(setq color (fifth (car entry-list)))
! 		(save-excursion
! 		  (if (not (string= color ""))
! 		      (progn
!                        (search-backward entry)
!                        (setq temp-face (make-symbol (concat "cal-col-face-" color)))
!                        (make-face temp-face)
!                        (set-face-foreground temp-face color)
!                        (overlay-put
!                         (make-overlay (match-beginning 0) (match-end 0)) 'face temp-face)))
! 		  )))
! 	  (setq entry-list (cdr entry-list))))
        (set-buffer-modified-p nil)
        (goto-char (point-min))
        (setq buffer-read-only t)
        (display-buffer fancy-diary-buffer)
***************
*** 696,703 ****
--- 728,743 ----
          (if (file-readable-p d-file)
              (save-excursion
                (message "Marking diary entries...")
                (set-buffer (find-file-noselect d-file t))
+ 	      ;; AMI - find global color for this file
+ 	      (setq file-glob-color "")
+ 	      (save-excursion
+ 		(goto-char (point-min))
+ 		(if (re-search-forward diary-glob-file-color-regexp (point-max) t)
+ 		    (setq file-glob-color (buffer-substring-no-properties
+ 					   (match-beginning 1)
+ 					   (match-end 1)))))
                (let ((d diary-date-forms)
                      (old-diary-syntax-table))
                  (setq old-diary-syntax-table (syntax-table))
                  (set-syntax-table diary-syntax-table)
***************
*** 774,789 ****
                                             (if (> (- current-y y) 50)
                                                 (+ y 100)
                                               y)))
                                       (string-to-int y-str)))))
                          (if dd-name
                              (mark-calendar-days-named
                               (cdr (assoc-ignore-case
                                     (substring dd-name 0 3)
                                     (calendar-make-alist
                                      calendar-day-name-array
                                      0
!                                     (lambda (x) (substring x 0 3))))))
                            (if mm-name
                                (if (string-equal mm-name "*")
                                    (setq mm 0)
                                  (setq mm
--- 814,836 ----
                                             (if (> (- current-y y) 50)
                                                 (+ y 100)
                                               y)))
                                       (string-to-int y-str)))))
+ 			;; AMI - find color for this diary entry
+  			(setq color file-glob-color)
+  			(save-excursion
+ 			  (if (re-search-forward diary-color-regexp (line-end-position) t)
+  			      (setq color (buffer-substring-no-properties
+ 					   (match-beginning 1)
+  					   (match-end 1)))))
                          (if dd-name
                              (mark-calendar-days-named
                               (cdr (assoc-ignore-case
                                     (substring dd-name 0 3)
                                     (calendar-make-alist
                                      calendar-day-name-array
                                      0
!                                     (lambda (x) (substring x 0 3))))) color)
                            (if mm-name
                                (if (string-equal mm-name "*")
                                    (setq mm 0)
                                  (setq mm
***************
*** 793,801 ****
                                               calendar-month-name-array
                                               1
                                               (lambda (x) (substring x 0 3)))
                                              )))))
!                           (mark-calendar-date-pattern mm dd yy))))
                      (setq d (cdr d))))
                  (mark-sexp-diary-entries)
                  (run-hooks 'nongregorian-diary-marking-hook
                             'mark-diary-entries-hook)
--- 840,848 ----
                                               calendar-month-name-array
                                               1
                                               (lambda (x) (substring x 0 3)))
                                              )))))
!                           (mark-calendar-date-pattern mm dd yy color))))
                      (setq d (cdr d))))
                  (mark-sexp-diary-entries)
                  (run-hooks 'nongregorian-diary-marking-hook
                             'mark-diary-entries-hook)
***************
*** 850,858 ****
                       (char-equal (preceding-char) ?\n))
                   (not (looking-at " \\|\^I")))
              (progn;; Diary entry consists only of the sexp
                (backward-char 1)
!               (setq entry ""))
            (setq entry-start (point))
            ;; Find end of entry
            (re-search-forward "\^M\\|\n" nil t)
            (while (looking-at " \\|\^I")
--- 897,905 ----
                       (char-equal (preceding-char) ?\n))
                   (not (looking-at " \\|\^I")))
              (progn;; Diary entry consists only of the sexp
                (backward-char 1)
!               (setq entry ""  color nil))
            (setq entry-start (point))
            ;; Find end of entry
            (re-search-forward "\^M\\|\n" nil t)
            (while (looking-at " \\|\^I")
***************
*** 866,877 ****
              (aset entry (match-beginning 0) ?\n )))
          (calendar-for-loop date from first-date to last-date do
            (if (setq mark (diary-sexp-entry sexp entry
                                  (calendar-gregorian-from-absolute date)))
!               (mark-visible-calendar-date
!                (calendar-gregorian-from-absolute date)
!                (if (consp mark)
!                    (car mark)))))))))
  
  (defun mark-included-diary-files ()
    "Mark the diary entries from other diary files with those of the diary file.
  This function is suitable for use as the `mark-diary-entries-hook'; it enables
--- 913,934 ----
              (aset entry (match-beginning 0) ?\n )))
          (calendar-for-loop date from first-date to last-date do
            (if (setq mark (diary-sexp-entry sexp entry
                                  (calendar-gregorian-from-absolute date)))
! 	      ;; AMI - find color for this diary entry
! 	      (progn
! 		(setq color "")
! 		(save-excursion
! 		  (if (string-match diary-color-regexp entry)
! 		      (setq color (substring-no-properties entry
! 							   (match-beginning 1)
! 							   (match-end 1)))))
! 		(mark-visible-calendar-date
! 		 (calendar-gregorian-from-absolute date) 
! 		 (if (< 0 (length color))
! 		     color
! 		   (if (consp mark)
! 		     (car mark)))))))))))
  
  (defun mark-included-diary-files ()
    "Mark the diary entries from other diary files with those of the diary file.
  This function is suitable for use as the `mark-diary-entries-hook'; it enables
***************
*** 904,912 ****
          (message "Can't find included diary file %s" diary-file)
          (sleep-for 2))))
    (goto-char (point-min)))
  
! (defun mark-calendar-days-named (dayname)
    "Mark all dates in the calendar window that are day DAYNAME of the week.
  0 means all Sundays, 1 means all Mondays, and so on."
    (save-excursion
      (set-buffer calendar-buffer)
--- 961,969 ----
          (message "Can't find included diary file %s" diary-file)
          (sleep-for 2))))
    (goto-char (point-min)))
  
! (defun mark-calendar-days-named (dayname &optional color)
    "Mark all dates in the calendar window that are day DAYNAME of the week.
  0 means all Sundays, 1 means all Mondays, and so on."
    (save-excursion
      (set-buffer calendar-buffer)
***************
*** 922,945 ****
                   (calendar-nth-named-day 1 dayname prev-month prev-year)))
        (setq last-day (calendar-absolute-from-gregorian
                   (calendar-nth-named-day -1 dayname succ-month succ-year)))
        (while (<= day last-day)
!         (mark-visible-calendar-date (calendar-gregorian-from-absolute day))
          (setq day (+ day 7))))))
  
! (defun mark-calendar-date-pattern (month day year)
    "Mark all dates in the calendar window that conform to MONTH/DAY/YEAR.
  A value of 0 in any position is a wildcard."
    (save-excursion
      (set-buffer calendar-buffer)
      (let ((m displayed-month)
            (y displayed-year))
        (increment-calendar-month m y -1)
        (calendar-for-loop i from 0 to 2 do
!           (mark-calendar-month m y month day year)
            (increment-calendar-month m y 1)))))
  
! (defun mark-calendar-month (month year p-month p-day p-year)
    "Mark dates in the MONTH/YEAR that conform to pattern P-MONTH/P_DAY/P-YEAR.
  A value of 0 in any position of the pattern is a wildcard."
    (if (or (and (= month p-month)
                 (or (= p-year 0) (= year p-year)))
--- 979,1002 ----
                   (calendar-nth-named-day 1 dayname prev-month prev-year)))
        (setq last-day (calendar-absolute-from-gregorian
                   (calendar-nth-named-day -1 dayname succ-month succ-year)))
        (while (<= day last-day)
!         (mark-visible-calendar-date (calendar-gregorian-from-absolute day) color)
          (setq day (+ day 7))))))
  
! (defun mark-calendar-date-pattern (month day year &optional color)
    "Mark all dates in the calendar window that conform to MONTH/DAY/YEAR.
  A value of 0 in any position is a wildcard."
    (save-excursion
      (set-buffer calendar-buffer)
      (let ((m displayed-month)
            (y displayed-year))
        (increment-calendar-month m y -1)
        (calendar-for-loop i from 0 to 2 do
!           (mark-calendar-month m y month day year color)
            (increment-calendar-month m y 1)))))
  
! (defun mark-calendar-month (month year p-month p-day p-year &optional color)
    "Mark dates in the MONTH/YEAR that conform to pattern P-MONTH/P_DAY/P-YEAR.
  A value of 0 in any position of the pattern is a wildcard."
    (if (or (and (= month p-month)
                 (or (= p-year 0) (= year p-year)))
***************
*** 947,956 ****
                 (or (= p-year 0) (= year p-year))))
        (if (= p-day 0)
            (calendar-for-loop
                i from 1 to (calendar-last-day-of-month month year) do
!             (mark-visible-calendar-date (list month i year)))
!         (mark-visible-calendar-date (list month p-day year)))))
  
  (defun sort-diary-entries ()
    "Sort the list of diary entries by time of day."
    (setq diary-entries-list (sort diary-entries-list 'diary-entry-compare)))
--- 1004,1013 ----
                 (or (= p-year 0) (= year p-year))))
        (if (= p-day 0)
            (calendar-for-loop
                i from 1 to (calendar-last-day-of-month month year) do
!             (mark-visible-calendar-date (list month i year) color))
!         (mark-visible-calendar-date (list month p-day year) color))))
  
  (defun sort-diary-entries ()
    "Sort the list of diary entries by time of day."
    (setq diary-entries-list (sort diary-entries-list 'diary-entry-compare)))
***************
*** 1171,1178 ****
--- 1228,1240 ----
           (sexp-mark (regexp-quote sexp-diary-entry-symbol))
           (s-entry (concat "\\(\\`\\|\^M\\|\n\\)" mark "?" sexp-mark "("))
           (entry-found))
      (goto-char (point-min))
+     (save-excursion
+       (if (re-search-forward diary-glob-file-color-regexp (point-max) t)
+ 	  (setq file-glob-color (buffer-substring-no-properties
+ 				 (match-beginning 1)
+ 				 (match-end 1)))))
      (while (re-search-forward s-entry nil t)
        (backward-char 1)
        (let ((sexp-start (point))
              (sexp)
***************
*** 1203,1219 ****
            (setq entry (buffer-substring-no-properties entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
          (let ((diary-entry (diary-sexp-entry sexp entry date)))
            (if diary-entry
!               (subst-char-in-region line-start (point) ?\^M ?\n t))
!           (add-to-diary-list date
! 			     (if (consp diary-entry)
! 				 (cdr diary-entry)
! 			       diary-entry)
  			     specifier
  			     (if entry-start (copy-marker entry-start)
! 			       nil))
  	  (setq entry-found (or entry-found diary-entry)))))
      entry-found))
  
  (defun diary-sexp-entry (sexp entry date)
--- 1265,1291 ----
            (setq entry (buffer-substring-no-properties entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
          (let ((diary-entry (diary-sexp-entry sexp entry date)))
+ 	  (setq entry (if (consp diary-entry)
+ 			  (cdr diary-entry)
+ 			diary-entry))
            (if diary-entry
! 	      (progn
! 		(subst-char-in-region line-start (point) ?\^M ?\n t)
! 		(setq color file-glob-color)
! 		(if (< 0 (length entry))
! 		    (save-excursion
! 		      (if (string-match diary-color-regexp entry) 
! 			  (setq color (substring-no-properties entry
! 				       (match-beginning 1)
! 				       (match-end 1))))))))
! 	  (add-to-diary-list date
! 			     entry
  			     specifier
  			     (if entry-start (copy-marker entry-start)
! 			       nil) 
! 			     color)
  	  (setq entry-found (or entry-found diary-entry)))))
      entry-found))
  
  (defun diary-sexp-entry (sexp entry date)
***************
*** 1469,1483 ****
       ((and (listp days) days)
        (or (diary-remind sexp (car days) marking)
            (diary-remind sexp (cdr days) marking))))))
  
! (defun add-to-diary-list (date string specifier marker)
!   "Add the entry (DATE STRING SPECIFIER) to `diary-entries-list'.
  Do nothing if DATE or STRING is nil."
    (and date string
         (setq diary-entries-list
               (append diary-entries-list
! 		     (list (list date string specifier marker))))))
  
  (defun make-diary-entry (string &optional nonmarking file)
    "Insert a diary entry STRING which may be NONMARKING in FILE.
  If omitted, NONMARKING defaults to nil and FILE defaults to diary-file."
--- 1541,1558 ----
       ((and (listp days) days)
        (or (diary-remind sexp (car days) marking)
            (diary-remind sexp (cdr days) marking))))))
  
! (defun add-to-diary-list (date string specifier marker &optional globcolor)
!   "Add the entry (DATE STRING SPECIFIER MARKER GLOBCOLOR) to `diary-entries-list'.
  Do nothing if DATE or STRING is nil."
    (and date string
+        (if diary-file-name-prefix
+ 	   (setq string (concat "[" (buffer-file-name) "] " string))
+ 	 t)
         (setq diary-entries-list
               (append diary-entries-list
! 		     (list (list date string specifier marker globcolor))))))
  
  (defun make-diary-entry (string &optional nonmarking file)
    "Insert a diary entry STRING which may be NONMARKING in FILE.
  If omitted, NONMARKING defaults to nil and FILE defaults to diary-file."

[-- Attachment #4: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://mail.gnu.org/mailman/listinfo/emacs-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-12 18:24   ` Ami Fischman
@ 2002-12-12 18:56     ` Ami Fischman
  2002-12-12 19:31     ` Alan Shutko
  2002-12-14  1:05     ` Alan Shutko
  2 siblings, 0 replies; 24+ messages in thread
From: Ami Fischman @ 2002-12-12 18:56 UTC (permalink / raw)


[-- Attachment #1: Type: text/plain, Size: 713 bytes --]

I made one more change to the file-name-prefixing of diary entries using a
defcustom to define a "transformation function."  I now have in my .emacs:
(setq diary-file-name-prefix-function (function (lambda (str) (replace-in-string str (substitute-in-file-name "$HOME/.diary\.?") ""))) 
(setq diary-file-name-prefix t)

and with the patch below, this yields no prefix for entries from ~/.diary,
and a "[birthdays] " prefix for entries from my ~/.diary.birthdays file.

The default for diary-file-name-prefix is still nil, since if a person
doesn't know enough to define diary-file-name-prefix-function, s/he
probably doesn't want the prefixes in the first place.

Cheers,
-- 
  Ami Fischman
  usenet@fischman.org


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: col-cal.patch --]
[-- Type: text/x-patch, Size: 3952 bytes --]

*** /home/fischman/cvs/emacs/lisp/calendar/calendar.el	2002-12-07 13:30:57.000000000 -0800
--- calendar.el	2002-12-12 10:40:24.000000000 -0800
***************
*** 309,316 ****
--- 309,321 ----
  calendar."
    :type 'boolean
    :group 'holidays)
  
+ (defcustom diary-file-name-prefix-function (function (lambda (str) str))
+   "*The function that will take a diary file name and return the desired prefix."
+   :type 'string
+   :group 'diary)
+ 
  ;;;###autoload
  (defcustom calendar-load-hook nil
    "*List of functions to be called after the calendar is first loaded.
  This is the place to add key bindings to `calendar-mode-map'."
***************
*** 496,503 ****
--- 501,525 ----
  See the documentation for the function `include-other-diary-files'."
    :type 'string
    :group 'diary)
  
+ (defcustom diary-glob-file-color-regexp "^#[ \t]*\\[color:\\([a-z]+\\)\\]$"
+   "*The regular expression that picks off the global file color for 
+ colored diary/calendar displays."
+   :type 'string
+   :group 'diary)
+ 
+ (defcustom diary-color-regexp "\\[color:\\([a-z]+\\)\\]$"
+   "*The regular expression that picks off the entry's color for 
+ colored diary/calendar displays."
+   :type 'string
+   :group 'diary)
+ 
+ (defcustom diary-file-name-prefix nil
+   "If non-nil then each entry in the diary list will be prefixed with the name of the file in which it was defined."
+   :type 'boolean
+   :group 'diary)
+ 
  ;;;###autoload
  (defcustom sexp-diary-entry-symbol "%%"
    "*The string used to indicate a sexp diary entry in `diary-file'.
  See the documentation for the function `list-sexp-diary-entries'."
***************
*** 2552,2574 ****
     (= (extract-calendar-year date1) (extract-calendar-year date2))))
  
  (defun mark-visible-calendar-date (date &optional mark)
    "Mark DATE in the calendar window with MARK.
! MARK is either a single-character string or a face.
  MARK defaults to `diary-entry-marker'."
    (if (calendar-date-is-legal-p date)
        (save-excursion
          (set-buffer calendar-buffer)
          (calendar-cursor-to-visible-date date)
!         (let ((mark (or mark diary-entry-marker)))
!           (if (stringp mark)
!               (let ((buffer-read-only nil))
!                 (forward-char 1)
!                 (delete-char 1)
!                 (insert mark)
!                 (forward-char -2))
! 	    (overlay-put
!              (make-overlay (1- (point)) (1+ (point))) 'face mark))))))
  
  (defun calendar-star-date ()
    "Replace the date under the cursor in the calendar window with asterisks.
  This function can be used with the `today-visible-calendar-hook' run after the
--- 2574,2605 ----
     (= (extract-calendar-year date1) (extract-calendar-year date2))))
  
  (defun mark-visible-calendar-date (date &optional mark)
    "Mark DATE in the calendar window with MARK.
! MARK is a single-character string, an x-color-name string, or a face.
  MARK defaults to `diary-entry-marker'."
    (if (calendar-date-is-legal-p date)
        (save-excursion
          (set-buffer calendar-buffer)
          (calendar-cursor-to-visible-date date)
! 	(let ((mark (or (and (stringp mark) (> (length mark) 0) mark)
! 			(and (not (stringp mark)) mark)
! 			diary-entry-marker)))
! 	  (if (stringp mark)
! 	      (if (= (length mark) 1)
! 		  (let ((buffer-read-only nil))
! 		    (forward-char 1)
! 		    (delete-char 1)
! 		    (insert mark)
! 		    (forward-char -2))
! 		(progn
! 		  (setq temp-face (make-symbol (concat "cal-col-face-" mark)))
! 		  (make-face temp-face)
! 		  (set-face-foreground temp-face mark)
! 		  (overlay-put
! 		   (make-overlay (1- (point)) (1+ (point))) 'face temp-face)))
!             (overlay-put
! 	     (make-overlay (1- (point)) (1+ (point))) 'face mark))))))
  
  (defun calendar-star-date ()
    "Replace the date under the cursor in the calendar window with asterisks.
  This function can be used with the `today-visible-calendar-hook' run after the

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: col-dia.patch --]
[-- Type: text/x-patch, Size: 20061 bytes --]

*** /home/fischman/cvs/emacs/lisp/calendar/diary-lib.el	2002-11-18 01:05:22.000000000 -0800
--- diary-lib.el	2002-12-12 10:43:03.000000000 -0800
***************
*** 232,239 ****
--- 232,247 ----
  		(set-buffer (find-file-noselect d-file t))
  	      (set-buffer diary-buffer)
  	      (or (verify-visited-file-modtime diary-buffer)
  		  (revert-buffer t t))))
+ 	  ;; AMI -- Figure out the file-glob-color
+ 	  (setq file-glob-color "")
+ 	  (save-excursion
+ 	    (goto-char (point-min))
+ 	    (if (re-search-forward diary-glob-file-color-regexp (point-max) t)
+ 		(setq file-glob-color (buffer-substring-no-properties
+ 				       (match-beginning 1)
+ 				       (match-end 1)))))
            (setq selective-display t)
            (setq selective-display-ellipses nil)
            (setq old-diary-syntax-table (syntax-table))
            (set-syntax-table diary-syntax-table)
***************
*** 307,327 ****
                                 (re-search-forward "\^M\\|\n" nil t))
                               (backward-char 1)
                               (subst-char-in-region date-start
                                  (point) ?\^M ?\n t)
                               (add-to-diary-list
                                date
!                               (buffer-substring
!                                entry-start (point))
                                (buffer-substring
                                 (1+ date-start) (1- entry-start))
! 			      (copy-marker entry-start))))))
                       (setq d (cdr d)))
                     (or entry-found
                         (not diary-list-include-blanks)
                         (setq diary-entries-list
                               (append diary-entries-list
!                                      (list (list date "" "")))))
                     (setq date
                           (calendar-gregorian-from-absolute
                             (1+ (calendar-absolute-from-gregorian date))))
                     (setq entry-found nil)))
--- 315,341 ----
                                 (re-search-forward "\^M\\|\n" nil t))
                               (backward-char 1)
                               (subst-char-in-region date-start
                                  (point) ?\^M ?\n t)
+ 			     (setq color file-glob-color)
+ 			     (setq entry (buffer-substring entry-start (point)))
+ 			     (save-excursion
+ 			       (if (string-match diary-color-regexp entry)
+ 				   (setq color (substring-no-properties entry
+ 									(match-beginning 1)
+ 									(match-end 1)))))
                               (add-to-diary-list
                                date
! 			      entry
                                (buffer-substring
                                 (1+ date-start) (1- entry-start))
! 			      (copy-marker entry-start) color)))))
                       (setq d (cdr d)))
                     (or entry-found
                         (not diary-list-include-blanks)
                         (setq diary-entries-list
                               (append diary-entries-list
!                                      (list (list date "" "" "" "")))))
                     (setq date
                           (calendar-gregorian-from-absolute
                             (1+ (calendar-absolute-from-gregorian date))))
                     (setq entry-found nil)))
***************
*** 512,526 ****
  					 x)
                                         date-holiday-list
                                         (concat "\n" (make-string l ? ))))
                      (insert ?\n (make-string (+ l longest) ?=) ?\n)))))
!           (if (< 0 (length (car (cdr (car entry-list)))))
! 	      (if (nth 3 (car entry-list))
! 		  (insert-button (concat (car (cdr (car entry-list))) "\n")
! 				 'marker (nth 3 (car entry-list))
! 				 :type 'diary-entry)
! 		(insert (car (cdr (car entry-list))) ?\n)))
!           (setq entry-list (cdr entry-list))))
        (set-buffer-modified-p nil)
        (goto-char (point-min))
        (setq buffer-read-only t)
        (display-buffer fancy-diary-buffer)
--- 526,558 ----
  					 x)
                                         date-holiday-list
                                         (concat "\n" (make-string l ? ))))
                      (insert ?\n (make-string (+ l longest) ?=) ?\n)))))
! 
! 	  (setq entry (car (cdr (car entry-list))))
! 	  (if (< 0 (length entry))
! 	      (progn
! 		(if (nth 3 (car entry-list))
! 		    (insert-button (concat entry "\n")
! 				   'marker (nth 3 (car entry-list))
! 				   :type 'diary-entry)
! 		  (insert entry ?\n))
! 		;; AMI -- pick off the color that was the global file 
! 		;;        color for this entry when it was read in
! ;		(setq file-glob-color (fifth (car entry-list)))
! 		;; AMI - find color for this diary entry if one is present
! 		(setq color (fifth (car entry-list)))
! 		(save-excursion
! 		  (if (not (string= color ""))
! 		      (progn
!                        (search-backward entry)
!                        (setq temp-face (make-symbol (concat "cal-col-face-" color)))
!                        (make-face temp-face)
!                        (set-face-foreground temp-face color)
!                        (overlay-put
!                         (make-overlay (match-beginning 0) (match-end 0)) 'face temp-face)))
! 		  )))
! 	  (setq entry-list (cdr entry-list))))
        (set-buffer-modified-p nil)
        (goto-char (point-min))
        (setq buffer-read-only t)
        (display-buffer fancy-diary-buffer)
***************
*** 696,703 ****
--- 728,743 ----
          (if (file-readable-p d-file)
              (save-excursion
                (message "Marking diary entries...")
                (set-buffer (find-file-noselect d-file t))
+ 	      ;; AMI - find global color for this file
+ 	      (setq file-glob-color "")
+ 	      (save-excursion
+ 		(goto-char (point-min))
+ 		(if (re-search-forward diary-glob-file-color-regexp (point-max) t)
+ 		    (setq file-glob-color (buffer-substring-no-properties
+ 					   (match-beginning 1)
+ 					   (match-end 1)))))
                (let ((d diary-date-forms)
                      (old-diary-syntax-table))
                  (setq old-diary-syntax-table (syntax-table))
                  (set-syntax-table diary-syntax-table)
***************
*** 774,789 ****
                                             (if (> (- current-y y) 50)
                                                 (+ y 100)
                                               y)))
                                       (string-to-int y-str)))))
                          (if dd-name
                              (mark-calendar-days-named
                               (cdr (assoc-ignore-case
                                     (substring dd-name 0 3)
                                     (calendar-make-alist
                                      calendar-day-name-array
                                      0
!                                     (lambda (x) (substring x 0 3))))))
                            (if mm-name
                                (if (string-equal mm-name "*")
                                    (setq mm 0)
                                  (setq mm
--- 814,836 ----
                                             (if (> (- current-y y) 50)
                                                 (+ y 100)
                                               y)))
                                       (string-to-int y-str)))))
+ 			;; AMI - find color for this diary entry
+  			(setq color file-glob-color)
+  			(save-excursion
+ 			  (if (re-search-forward diary-color-regexp (line-end-position) t)
+  			      (setq color (buffer-substring-no-properties
+ 					   (match-beginning 1)
+  					   (match-end 1)))))
                          (if dd-name
                              (mark-calendar-days-named
                               (cdr (assoc-ignore-case
                                     (substring dd-name 0 3)
                                     (calendar-make-alist
                                      calendar-day-name-array
                                      0
!                                     (lambda (x) (substring x 0 3))))) color)
                            (if mm-name
                                (if (string-equal mm-name "*")
                                    (setq mm 0)
                                  (setq mm
***************
*** 793,801 ****
                                               calendar-month-name-array
                                               1
                                               (lambda (x) (substring x 0 3)))
                                              )))))
!                           (mark-calendar-date-pattern mm dd yy))))
                      (setq d (cdr d))))
                  (mark-sexp-diary-entries)
                  (run-hooks 'nongregorian-diary-marking-hook
                             'mark-diary-entries-hook)
--- 840,848 ----
                                               calendar-month-name-array
                                               1
                                               (lambda (x) (substring x 0 3)))
                                              )))))
!                           (mark-calendar-date-pattern mm dd yy color))))
                      (setq d (cdr d))))
                  (mark-sexp-diary-entries)
                  (run-hooks 'nongregorian-diary-marking-hook
                             'mark-diary-entries-hook)
***************
*** 850,858 ****
                       (char-equal (preceding-char) ?\n))
                   (not (looking-at " \\|\^I")))
              (progn;; Diary entry consists only of the sexp
                (backward-char 1)
!               (setq entry ""))
            (setq entry-start (point))
            ;; Find end of entry
            (re-search-forward "\^M\\|\n" nil t)
            (while (looking-at " \\|\^I")
--- 897,905 ----
                       (char-equal (preceding-char) ?\n))
                   (not (looking-at " \\|\^I")))
              (progn;; Diary entry consists only of the sexp
                (backward-char 1)
!               (setq entry ""  color nil))
            (setq entry-start (point))
            ;; Find end of entry
            (re-search-forward "\^M\\|\n" nil t)
            (while (looking-at " \\|\^I")
***************
*** 866,877 ****
              (aset entry (match-beginning 0) ?\n )))
          (calendar-for-loop date from first-date to last-date do
            (if (setq mark (diary-sexp-entry sexp entry
                                  (calendar-gregorian-from-absolute date)))
!               (mark-visible-calendar-date
!                (calendar-gregorian-from-absolute date)
!                (if (consp mark)
!                    (car mark)))))))))
  
  (defun mark-included-diary-files ()
    "Mark the diary entries from other diary files with those of the diary file.
  This function is suitable for use as the `mark-diary-entries-hook'; it enables
--- 913,934 ----
              (aset entry (match-beginning 0) ?\n )))
          (calendar-for-loop date from first-date to last-date do
            (if (setq mark (diary-sexp-entry sexp entry
                                  (calendar-gregorian-from-absolute date)))
! 	      ;; AMI - find color for this diary entry
! 	      (progn
! 		(setq color "")
! 		(save-excursion
! 		  (if (string-match diary-color-regexp entry)
! 		      (setq color (substring-no-properties entry
! 							   (match-beginning 1)
! 							   (match-end 1)))))
! 		(mark-visible-calendar-date
! 		 (calendar-gregorian-from-absolute date) 
! 		 (if (< 0 (length color))
! 		     color
! 		   (if (consp mark)
! 		     (car mark)))))))))))
  
  (defun mark-included-diary-files ()
    "Mark the diary entries from other diary files with those of the diary file.
  This function is suitable for use as the `mark-diary-entries-hook'; it enables
***************
*** 904,912 ****
          (message "Can't find included diary file %s" diary-file)
          (sleep-for 2))))
    (goto-char (point-min)))
  
! (defun mark-calendar-days-named (dayname)
    "Mark all dates in the calendar window that are day DAYNAME of the week.
  0 means all Sundays, 1 means all Mondays, and so on."
    (save-excursion
      (set-buffer calendar-buffer)
--- 961,969 ----
          (message "Can't find included diary file %s" diary-file)
          (sleep-for 2))))
    (goto-char (point-min)))
  
! (defun mark-calendar-days-named (dayname &optional color)
    "Mark all dates in the calendar window that are day DAYNAME of the week.
  0 means all Sundays, 1 means all Mondays, and so on."
    (save-excursion
      (set-buffer calendar-buffer)
***************
*** 922,945 ****
                   (calendar-nth-named-day 1 dayname prev-month prev-year)))
        (setq last-day (calendar-absolute-from-gregorian
                   (calendar-nth-named-day -1 dayname succ-month succ-year)))
        (while (<= day last-day)
!         (mark-visible-calendar-date (calendar-gregorian-from-absolute day))
          (setq day (+ day 7))))))
  
! (defun mark-calendar-date-pattern (month day year)
    "Mark all dates in the calendar window that conform to MONTH/DAY/YEAR.
  A value of 0 in any position is a wildcard."
    (save-excursion
      (set-buffer calendar-buffer)
      (let ((m displayed-month)
            (y displayed-year))
        (increment-calendar-month m y -1)
        (calendar-for-loop i from 0 to 2 do
!           (mark-calendar-month m y month day year)
            (increment-calendar-month m y 1)))))
  
! (defun mark-calendar-month (month year p-month p-day p-year)
    "Mark dates in the MONTH/YEAR that conform to pattern P-MONTH/P_DAY/P-YEAR.
  A value of 0 in any position of the pattern is a wildcard."
    (if (or (and (= month p-month)
                 (or (= p-year 0) (= year p-year)))
--- 979,1002 ----
                   (calendar-nth-named-day 1 dayname prev-month prev-year)))
        (setq last-day (calendar-absolute-from-gregorian
                   (calendar-nth-named-day -1 dayname succ-month succ-year)))
        (while (<= day last-day)
!         (mark-visible-calendar-date (calendar-gregorian-from-absolute day) color)
          (setq day (+ day 7))))))
  
! (defun mark-calendar-date-pattern (month day year &optional color)
    "Mark all dates in the calendar window that conform to MONTH/DAY/YEAR.
  A value of 0 in any position is a wildcard."
    (save-excursion
      (set-buffer calendar-buffer)
      (let ((m displayed-month)
            (y displayed-year))
        (increment-calendar-month m y -1)
        (calendar-for-loop i from 0 to 2 do
!           (mark-calendar-month m y month day year color)
            (increment-calendar-month m y 1)))))
  
! (defun mark-calendar-month (month year p-month p-day p-year &optional color)
    "Mark dates in the MONTH/YEAR that conform to pattern P-MONTH/P_DAY/P-YEAR.
  A value of 0 in any position of the pattern is a wildcard."
    (if (or (and (= month p-month)
                 (or (= p-year 0) (= year p-year)))
***************
*** 947,956 ****
                 (or (= p-year 0) (= year p-year))))
        (if (= p-day 0)
            (calendar-for-loop
                i from 1 to (calendar-last-day-of-month month year) do
!             (mark-visible-calendar-date (list month i year)))
!         (mark-visible-calendar-date (list month p-day year)))))
  
  (defun sort-diary-entries ()
    "Sort the list of diary entries by time of day."
    (setq diary-entries-list (sort diary-entries-list 'diary-entry-compare)))
--- 1004,1013 ----
                 (or (= p-year 0) (= year p-year))))
        (if (= p-day 0)
            (calendar-for-loop
                i from 1 to (calendar-last-day-of-month month year) do
!             (mark-visible-calendar-date (list month i year) color))
!         (mark-visible-calendar-date (list month p-day year) color))))
  
  (defun sort-diary-entries ()
    "Sort the list of diary entries by time of day."
    (setq diary-entries-list (sort diary-entries-list 'diary-entry-compare)))
***************
*** 1171,1178 ****
--- 1228,1240 ----
           (sexp-mark (regexp-quote sexp-diary-entry-symbol))
           (s-entry (concat "\\(\\`\\|\^M\\|\n\\)" mark "?" sexp-mark "("))
           (entry-found))
      (goto-char (point-min))
+     (save-excursion
+       (if (re-search-forward diary-glob-file-color-regexp (point-max) t)
+ 	  (setq file-glob-color (buffer-substring-no-properties
+ 				 (match-beginning 1)
+ 				 (match-end 1)))))
      (while (re-search-forward s-entry nil t)
        (backward-char 1)
        (let ((sexp-start (point))
              (sexp)
***************
*** 1203,1219 ****
            (setq entry (buffer-substring-no-properties entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
          (let ((diary-entry (diary-sexp-entry sexp entry date)))
            (if diary-entry
!               (subst-char-in-region line-start (point) ?\^M ?\n t))
!           (add-to-diary-list date
! 			     (if (consp diary-entry)
! 				 (cdr diary-entry)
! 			       diary-entry)
  			     specifier
  			     (if entry-start (copy-marker entry-start)
! 			       nil))
  	  (setq entry-found (or entry-found diary-entry)))))
      entry-found))
  
  (defun diary-sexp-entry (sexp entry date)
--- 1265,1291 ----
            (setq entry (buffer-substring-no-properties entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
          (let ((diary-entry (diary-sexp-entry sexp entry date)))
+ 	  (setq entry (if (consp diary-entry)
+ 			  (cdr diary-entry)
+ 			diary-entry))
            (if diary-entry
! 	      (progn
! 		(subst-char-in-region line-start (point) ?\^M ?\n t)
! 		(setq color file-glob-color)
! 		(if (< 0 (length entry))
! 		    (save-excursion
! 		      (if (string-match diary-color-regexp entry) 
! 			  (setq color (substring-no-properties entry
! 				       (match-beginning 1)
! 				       (match-end 1))))))))
! 	  (add-to-diary-list date
! 			     entry
  			     specifier
  			     (if entry-start (copy-marker entry-start)
! 			       nil) 
! 			     color)
  	  (setq entry-found (or entry-found diary-entry)))))
      entry-found))
  
  (defun diary-sexp-entry (sexp entry date)
***************
*** 1469,1483 ****
       ((and (listp days) days)
        (or (diary-remind sexp (car days) marking)
            (diary-remind sexp (cdr days) marking))))))
  
! (defun add-to-diary-list (date string specifier marker)
!   "Add the entry (DATE STRING SPECIFIER) to `diary-entries-list'.
  Do nothing if DATE or STRING is nil."
    (and date string
         (setq diary-entries-list
               (append diary-entries-list
! 		     (list (list date string specifier marker))))))
  
  (defun make-diary-entry (string &optional nonmarking file)
    "Insert a diary entry STRING which may be NONMARKING in FILE.
  If omitted, NONMARKING defaults to nil and FILE defaults to diary-file."
--- 1541,1560 ----
       ((and (listp days) days)
        (or (diary-remind sexp (car days) marking)
            (diary-remind sexp (cdr days) marking))))))
  
! (defun add-to-diary-list (date string specifier marker &optional globcolor)
!   "Add the entry (DATE STRING SPECIFIER MARKER GLOBCOLOR) to `diary-entries-list'.
  Do nothing if DATE or STRING is nil."
    (and date string
+        (if (and diary-file-name-prefix
+ 		(setq prefix (concat "[" (funcall diary-file-name-prefix-function (buffer-file-name)) "] "))
+ 		(not (string= prefix "[] ")))
+ 	   (setq string (concat prefix string))
+ 	 t)
         (setq diary-entries-list
               (append diary-entries-list
! 		     (list (list date string specifier marker globcolor))))))
  
  (defun make-diary-entry (string &optional nonmarking file)
    "Insert a diary entry STRING which may be NONMARKING in FILE.
  If omitted, NONMARKING defaults to nil and FILE defaults to diary-file."

[-- Attachment #4: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://mail.gnu.org/mailman/listinfo/emacs-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-12 18:24   ` Ami Fischman
  2002-12-12 18:56     ` Ami Fischman
@ 2002-12-12 19:31     ` Alan Shutko
  2002-12-13 10:14       ` Kai Großjohann
  2002-12-14  1:05     ` Alan Shutko
  2 siblings, 1 reply; 24+ messages in thread
From: Alan Shutko @ 2002-12-12 19:31 UTC (permalink / raw)
  Cc: emacs-devel

Ami Fischman <usenet@fischman.org> writes:

> One other feature I added (at the request of Kai Grossjohann) is the
> prefixing of diary entries with the filename from which they came.  

I'll look at the rest later tonight, but I wonder why Kai wanted the
prefixing.  If you just want to know where the entry came from, you
can middle-click on the entry.  8^)

-- 
Alan Shutko <ats@acm.org> - In a variety of flavors!
Princess of Sorrow, Wilderness Angel--Jim Morrison

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-12 19:31     ` Alan Shutko
@ 2002-12-13 10:14       ` Kai Großjohann
  0 siblings, 0 replies; 24+ messages in thread
From: Kai Großjohann @ 2002-12-13 10:14 UTC (permalink / raw)


Alan Shutko <ats@acm.org> writes:

> I'll look at the rest later tonight, but I wonder why Kai wanted the
> prefixing.  If you just want to know where the entry came from, you
> can middle-click on the entry.  8^)

I like to have the overview.  It's like doing `30 d' to show the
diary entries of the next month.  Sure you can do `1 d' on 30
different days, but the overview is not as nice.

-- 
~/.signature is: umop ap!sdn    (Frank Nobis)

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-11 23:58 specific coloring of diary calendar entries Ami Fischman
  2002-12-12  1:02 ` Alan Shutko
@ 2002-12-13 22:22 ` Richard Stallman
  2002-12-13 23:37   ` Ami Fischman
  1 sibling, 1 reply; 24+ messages in thread
From: Richard Stallman @ 2002-12-13 22:22 UTC (permalink / raw)
  Cc: emacs-devel

      This is done via "color tags" -- a string
    that looks like "[color:blue]" (without the quotes, and blue can be any
    standard X color).

This is an ok feature, but it would be more useful if these tags
can specify a semantic category whose visual presentation is
defined elsewhere.

    If a date matches more than one entry, the FIRST matching entry's color is
    used for the date.

For explicit color tags, that's the best you can do.  But when using
semantic categories, you can do better.  You could pick the "most
important" semantic category according to a specified priority list,
from among those specified for the given date, and use its color.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-13 22:22 ` Richard Stallman
@ 2002-12-13 23:37   ` Ami Fischman
  2002-12-14  0:07     ` Alan Shutko
  2002-12-15 23:39     ` Richard Stallman
  0 siblings, 2 replies; 24+ messages in thread
From: Ami Fischman @ 2002-12-13 23:37 UTC (permalink / raw)
  Cc: emacs-devel

> This is an ok feature, but it would be more useful if these tags
> can specify a semantic category whose visual presentation is
> defined elsewhere.

That might be more useful indeed, but I personally don't see using such an
extended system.  The calendar display is too crowded for underlines,
italics, boldface, or different fonts to be useful in quick visual
recognition.  If someone else wants such a feature and wants to code it, of
course, I would have no objection.  Such  a system would obviously obviate
the need for my patches.  However, I conjecture that people are simply not
that interested in having such fine-grained calendar displays...

Cheers,
-- 
  Ami Fischman
  usenet@fischman.org

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-13 23:37   ` Ami Fischman
@ 2002-12-14  0:07     ` Alan Shutko
  2002-12-15 23:39     ` Richard Stallman
  1 sibling, 0 replies; 24+ messages in thread
From: Alan Shutko @ 2002-12-14  0:07 UTC (permalink / raw)
  Cc: rms

Ami Fischman <usenet@fischman.org> writes:

> The calendar display is too crowded for underlines, italics,
> boldface, or different fonts to be useful in quick visual
> recognition.

Actually, since I am currently using them, I'd disagree.  8^)

With the markup you are proposing, we could certainly add face:,
which could add more semantics, or something else entirely.  And for
now, people who want them can use sexp entries to get it.

-- 
Alan Shutko <ats@acm.org> - In a variety of flavors!
"Damn It Jim!! I'm not a Doctor, just a bad actor on a canceled show"

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-12 18:24   ` Ami Fischman
  2002-12-12 18:56     ` Ami Fischman
  2002-12-12 19:31     ` Alan Shutko
@ 2002-12-14  1:05     ` Alan Shutko
  2002-12-14  1:42       ` Miles Bader
  2 siblings, 1 reply; 24+ messages in thread
From: Alan Shutko @ 2002-12-14  1:05 UTC (permalink / raw)
  Cc: emacs-devel

Ami Fischman <usenet@fischman.org> writes:

> True.  For some reason I was under the impression that the calendar mode
> was frozen for a long time.  Not sure why I thought that.

Well, it was... just had gotten changed recently.

> I know that for me, at least, it is much more useful to just say
> "[color:green]" than to create a face dedicated to having a green
> fg. 

Ok.  Maybe you should use "fgcolor" in case someone wants to specify a
bgcolor sometime?

> I disagree.  An irritated spouse is much better than a kid stranded for
> 8 hours after school ;)  I refer you to one of the early episodes of
> _Malcolm in the Middle_ for proof.

Actually, leaving the _Malcolm_ kids in school for 8 hours is
probably a good thing....

> + (defcustom diary-glob-file-color-regexp "^#[ \t]*\\[color:\\([a-z]+\\)\\]$"
> +   "*The regular expression that picks off the global file color for 
> + colored diary/calendar displays."
> +   :type 'string
> +   :group 'diary)

These should probably be :type regexp.

Other than that, I think things look good to me.

-- 
Alan Shutko <ats@acm.org> - In a variety of flavors!
Crystal Gravy - Now you can SEE your meat.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-14  1:05     ` Alan Shutko
@ 2002-12-14  1:42       ` Miles Bader
  0 siblings, 0 replies; 24+ messages in thread
From: Miles Bader @ 2002-12-14  1:42 UTC (permalink / raw)
  Cc: emacs-devel

On Fri, Dec 13, 2002 at 08:05:30PM -0500, Alan Shutko wrote:
> > I know that for me, at least, it is much more useful to just say
> > "[color:green]" than to create a face dedicated to having a green
> > fg. 
> 
> Ok.  Maybe you should use "fgcolor" in case someone wants to specify a
> bgcolor sometime?

In the emacs nomenclature, these are usually just `foreground' and
`background'.

-Miles
-- 
I'm beginning to think that life is just one long Yoko Ono album; no rhyme
or reason, just a lot of incoherent shrieks and then it's over.  --Ian Wolff

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-13 23:37   ` Ami Fischman
  2002-12-14  0:07     ` Alan Shutko
@ 2002-12-15 23:39     ` Richard Stallman
  2002-12-16  0:31       ` Alex Schroeder
  2002-12-17  6:18       ` Ami Fischman
  1 sibling, 2 replies; 24+ messages in thread
From: Richard Stallman @ 2002-12-15 23:39 UTC (permalink / raw)
  Cc: emacs-devel

    That might be more useful indeed, but I personally don't see using such an
    extended system.  The calendar display is too crowded for underlines,
    italics, boldface, or different fonts to be useful in quick visual
    recognition.  If someone else wants such a feature and wants to code it, of
    course, I would have no objection.  Such  a system would obviously obviate
    the need for my patches.

I think it would be a simple extension of your patches--so why not do
it?  You just have to allow a simple name with no colon and treat it
as a symbol which is a syntactic category.  Some property of the symbol
can specify the face property to use for display.

Even if people use only colors, it would still be cleaner to specify
them with syntactic categories rather than putting the colors directly
into the diary files.  The categories may someday be useful for other
purposes.  And they allow the priority handling that I suggested
when one date has two events.

Would you give it a try?

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-15 23:39     ` Richard Stallman
@ 2002-12-16  0:31       ` Alex Schroeder
  2002-12-17 18:44         ` Richard Stallman
  2002-12-17  6:18       ` Ami Fischman
  1 sibling, 1 reply; 24+ messages in thread
From: Alex Schroeder @ 2002-12-16  0:31 UTC (permalink / raw)


Richard Stallman <rms@gnu.org> writes:

> Even if people use only colors, it would still be cleaner to specify
> them with syntactic categories rather than putting the colors directly
> into the diary files.  The categories may someday be useful for other
> purposes.  And they allow the priority handling that I suggested
> when one date has two events.
>
> Would you give it a try?

As a start, we could do this as follows:

The word after the colon is checked for facep.  If so, this face is
used, if not, and it is a valid color name, then the color is used.
Later, if somebody feels like implementing categories, that can be
added easily.  I really like the simplicity of the original approach.
Having faces is one level of indirection, but having categories
mapping to faces or colors is even harder to use by a casual user.

Alex.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-15 23:39     ` Richard Stallman
  2002-12-16  0:31       ` Alex Schroeder
@ 2002-12-17  6:18       ` Ami Fischman
  2002-12-17  9:42         ` Alex Schroeder
                           ` (3 more replies)
  1 sibling, 4 replies; 24+ messages in thread
From: Ami Fischman @ 2002-12-17  6:18 UTC (permalink / raw)
  Cc: emacs-devel

I misread your previous post on this subject.  Specifically, I thought you
were asking for the tags to allow different attributes from color (so
there'd be [bgcolor:blah], [underline:blah], [bold:blah], etc tags).  Doing
that much work would just be silly, as someone who knows enough to define
the attributes of an emacs face can just create the face and use an sexp.

Upon re-reading your suggestion, I think what you are saying is you want the
ability to say [work] or [home] and have `work' and `home' be "categories"
-- presumably a conglomerate of face attributes that apply to the entry.
But how is this simpler than defining a "work" or "home" face and having an
sexp entry invoke it?

I guess I'm looking at two situations: the emacs expert and the emacs
novice.  The former knows how to create a face and attach it to an entry
even without my patches (using sexp's); the latter will now be able to
define f/g colors for his/her diary entries.  Is the difference between
defining/using "semantic categories" and defining/using emacs faces+sexp
entries really as large as the gap between expert and novice?  I think the
answer is no.  If you disagree, please let me know.

I'm not morally opposed to adding features to these patches.  I just don't
think there is an elegant way to add them to the code (the color patches are
already somewhat "glued on") and so would rather not do so unless there's a
demonstrated need or demand for them.  If others would like to see some form
of semantic categorization (going beyond f/g color, which can be achieved
with file-glob-color), please speak up :)

Cheers,
-- 
  Ami Fischman
  usenet@fischman.org

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-17  6:18       ` Ami Fischman
@ 2002-12-17  9:42         ` Alex Schroeder
  2002-12-17 16:03           ` Alan Shutko
  2002-12-17 11:05         ` Kai Großjohann
                           ` (2 subsequent siblings)
  3 siblings, 1 reply; 24+ messages in thread
From: Alex Schroeder @ 2002-12-17  9:42 UTC (permalink / raw)
  Cc: emacs-devel

Ami Fischman <usenet@fischman.org> writes:

> I'm not morally opposed to adding features to these patches.  I just don't
> think there is an elegant way to add them to the code (the color patches are
> already somewhat "glued on") and so would rather not do so unless there's a
> demonstrated need or demand for them.  If others would like to see some form
> of semantic categorization (going beyond f/g color, which can be achieved
> with file-glob-color), please speak up :)

I actually like the very simple color-name idea of yours.  

I am not sure what the current manual situation is, but in the
released 21.2, some of the very interesting Calendar stuff is in the
elisp manual.  Maybe that has to be rethought; and maybe some example
using faces (the expert solution you talk about) needs to be added to
the manual.  I just read through the node "Sexp Entries and the Fancy
Diary Display" in the old elisp manual and it says nothing about
faces.  But perhaps I just missed the beginning of the thread.  :)

Alex.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-17  6:18       ` Ami Fischman
  2002-12-17  9:42         ` Alex Schroeder
@ 2002-12-17 11:05         ` Kai Großjohann
  2002-12-17 16:02           ` Alan Shutko
  2002-12-17 11:07         ` Kai Großjohann
  2002-12-18  2:01         ` Richard Stallman
  3 siblings, 1 reply; 24+ messages in thread
From: Kai Großjohann @ 2002-12-17 11:05 UTC (permalink / raw)


Ami Fischman <usenet@fischman.org> writes:

> I guess I'm looking at two situations: the emacs expert and the emacs
> novice.  The former knows how to create a face and attach it to an entry
> even without my patches (using sexp's);

Excuse the silly question: how does one attach faces to an entry with
sexp's?
-- 
~/.signature is: umop ap!sdn    (Frank Nobis)

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-17  6:18       ` Ami Fischman
  2002-12-17  9:42         ` Alex Schroeder
  2002-12-17 11:05         ` Kai Großjohann
@ 2002-12-17 11:07         ` Kai Großjohann
  2002-12-18  2:01         ` Richard Stallman
  3 siblings, 0 replies; 24+ messages in thread
From: Kai Großjohann @ 2002-12-17 11:07 UTC (permalink / raw)


Ami Fischman <usenet@fischman.org> writes:

> I guess I'm looking at two situations: the emacs expert and the emacs
> novice.  The former knows how to create a face and attach it to an entry
> even without my patches (using sexp's); the latter will now be able to
> define f/g colors for his/her diary entries.

But your color stuff does more: you can define a default color for a
file.  I guess without your machinery, defining a default face for a
file would be much more difficult.

And I also guess that your machinery could easily be extended so that
entries tagged with [face:frumple], say, are displayed in the frumple
face.
-- 
~/.signature is: umop ap!sdn    (Frank Nobis)

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-17 11:05         ` Kai Großjohann
@ 2002-12-17 16:02           ` Alan Shutko
  0 siblings, 0 replies; 24+ messages in thread
From: Alan Shutko @ 2002-12-17 16:02 UTC (permalink / raw)
  Cc: emacs-devel

kai.grossjohann@uni-duisburg.de (Kai Großjohann) writes:

> Excuse the silly question: how does one attach faces to an entry with
> sexp's?

(emacs)Special Diary Entries
(elisp)Sexp Entries and the Fancy Diary Display

(CVS only right now.)
8^)

-- 
Alan Shutko <ats@acm.org> - In a variety of flavors!
Got Brother Jimmy on the TV and Killer on the stereo...

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-17  9:42         ` Alex Schroeder
@ 2002-12-17 16:03           ` Alan Shutko
  0 siblings, 0 replies; 24+ messages in thread
From: Alan Shutko @ 2002-12-17 16:03 UTC (permalink / raw)
  Cc: emacs-devel

Alex Schroeder <alex@emacswiki.org> writes:

> I just read through the node "Sexp Entries and the Fancy Diary
> Display" in the old elisp manual and it says nothing about faces.

It's new in CVS.  It'll be in 21.4 (or whatever the next non-bug
release is).

-- 
Alan Shutko <ats@acm.org> - In a variety of flavors!
There goes the bursar again, who's got the dried frog pills?

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-16  0:31       ` Alex Schroeder
@ 2002-12-17 18:44         ` Richard Stallman
  0 siblings, 0 replies; 24+ messages in thread
From: Richard Stallman @ 2002-12-17 18:44 UTC (permalink / raw)
  Cc: emacs-devel

    The word after the colon is checked for facep.  If so, this face is
    used, if not, and it is a valid color name, then the color is used.
    Later, if somebody feels like implementing categories, that can be
    added easily.

I don't think it is a good idea to let one name be either a face
or a color.  I recommend these alternatives instead:

* a face name

* a category name

* foreground:COLOR

* background:COLOR

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-17  6:18       ` Ami Fischman
                           ` (2 preceding siblings ...)
  2002-12-17 11:07         ` Kai Großjohann
@ 2002-12-18  2:01         ` Richard Stallman
  2002-12-18 22:27           ` Ami Fischman
  3 siblings, 1 reply; 24+ messages in thread
From: Richard Stallman @ 2002-12-18  2:01 UTC (permalink / raw)
  Cc: emacs-devel

    Upon re-reading your suggestion, I think what you are saying is you want the
    ability to say [work] or [home] and have `work' and `home' be "categories"
    -- presumably a conglomerate of face attributes that apply to the entry.
    But how is this simpler than defining a "work" or "home" face

I am not sure.  Perhaps being able to specify a face is good enough,
and we don't need a categories feature.

								  and having an
    sexp entry invoke it?

These tags are much more convenient than sexp entries.
To be able to specify a face (or category) with [...]
would certainly be a good feature.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-18  2:01         ` Richard Stallman
@ 2002-12-18 22:27           ` Ami Fischman
  2002-12-19  6:02             ` Ami Fischman
  0 siblings, 1 reply; 24+ messages in thread
From: Ami Fischman @ 2002-12-18 22:27 UTC (permalink / raw)
  Cc: emacs-devel

Richard Stallman <rms@gnu.org> writes:

[...]

> I am not sure.  Perhaps being able to specify a face is good enough,
> and we don't need a categories feature.

I think this is the case.

> 								  and having an
>     sexp entry invoke it?
>
> These tags are much more convenient than sexp entries.
> To be able to specify a face (or category) with [...]
> would certainly be a good feature.

My stubborness is apparently less powerful than my boredom.  I went ahead
and implemented general tagging (so there will be [background:blah],
[face:fooblah], [slant:italic], etc possibilities).  

However, one biggish problem is still in my way: I was under the impression
that overlays stacked "sensibly" -- i.e., if two overlays cover the same
region, and one's face defines a foreground (only) and the other's face defines a
background (only) then the resulting text will show both.  This turns out
not to be the case.  Is there any way to "merge" overlays like this?  By
the time the calendar is getting marked up with the second entry for a
particular date, the first entry is long gone, so there isn't the
possibility of merging the attribute lists "by hand" at this point.  I know
about setting priorities for overlays, but this would still result in
"exclusivity" -- only one entry's colors show.

Any pointers as to how to stack overlays "transparently" appreciated.
Other workarounds for the problem also sought :)

Cheers,
-- 
  Ami Fischman
  usenet@fischman.org

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-18 22:27           ` Ami Fischman
@ 2002-12-19  6:02             ` Ami Fischman
  2002-12-19 18:03               ` Ami Fischman
  0 siblings, 1 reply; 24+ messages in thread
From: Ami Fischman @ 2002-12-19  6:02 UTC (permalink / raw)


Ami Fischman <usenet@fischman.org> writes:

[...]

> However, one biggish problem is still in my way: I was under the impression
> that overlays stacked "sensibly" -- i.e., if two overlays cover the same
> region, and one's face defines a foreground (only) and the other's face defines a
> background (only) then the resulting text will show both.  This turns out

I guess I misspoke.  Seems to work fine now.  Will post updated patches
tomorrow probably (still cleaning up some small issues).

-- 
  Ami Fischman
  usenet@fischman.org

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: specific coloring of diary calendar entries
  2002-12-19  6:02             ` Ami Fischman
@ 2002-12-19 18:03               ` Ami Fischman
  0 siblings, 0 replies; 24+ messages in thread
From: Ami Fischman @ 2002-12-19 18:03 UTC (permalink / raw)


[-- Attachment #1: Type: text/plain, Size: 1030 bytes --]

At the request of a couple of people, I added tags for all the attributes a
face can have except :box :stipple (since I didn't want to mess with
parsing the possible values, and anyone defining them can just define their
own face), as well as taking [face:blah] tags.  These changes required
changing the layout of the parsing/usage of the data, and I think it is
better this way (much more general and extensible).  

So, the result is that one can define infinitely ugly and unreadable
calendars (hey, want to have one diary entry four times as large as the
rest?  Fine!  Want overlines over some entries and underlines under
others?  Excellent! :)).  And everything seems to work right.  One can
"stack" attributes (if a date has an entry with a f/g color defined and
another with b/g color defined, both show on the date, etc).

Since this iteration is much more involved than the previous ones, I'd like
to hear from a few people that they are running it through the paces.

Cheers,
-- 
  Ami Fischman
  usenet@fischman.org


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: col-dia.patch --]
[-- Type: text/x-patch, Size: 23875 bytes --]

*** /home/fischman/cvs/emacs/lisp/calendar/diary-lib.el	2002-11-18 01:05:22.000000000 -0800
--- diary-lib.el	2002-12-19 09:52:18.000000000 -0800
***************
*** 184,191 ****
--- 184,268 ----
  (defvar date-string)
  (defvar d-file)
  (defvar original-date)
  
+ (defun diary-attrtype-convert (attrvalue type)
+   "Convert the attrvalue from a string to the appropriate type for using
+ in a face description"
+   (let (ret)
+     (setq ret (cond ((eq type 'string) attrvalue)
+ 		    ((eq type 'symbol) (read attrvalue))
+ 		    ((eq type 'int) (string-to-int attrvalue))
+ 		    ((eq type 'stringtnil)
+ 		     (cond ((string= "t" attrvalue) t)
+ 			   ((string= "nil" attrvalue) nil)
+ 			   (t attrvalue)))
+ 		    ((eq type 'tnil)
+ 		     (cond ((string= "t" attrvalue) t)
+ 			   ((string= "nil" attrvalue) nil)))))
+ ;    (message "(%s)[%s]=[%s]" (print type) attrvalue ret)
+     ret))
+ 	
+ 
+ (defun diary-pull-attrs (entry fileglobattrs)
+   "Pull the face-related attributes off the entry, merge with the 
+ fileglobattrs, and return the (possibly modified) entry and face 
+ data in a list of attrname attrvalue values.  
+ The entry will be modified to drop all tags that are used for face matching.
+ If entry is nil, then the fileglobattrs are being searched for, 
+ the fileglobattrs variable is ignored, and 
+ diary-glob-file-regexp-prefix is prepended to the regexps before each 
+ search."
+   ;; XXX
+   (save-excursion
+     (let (regexp regnum attrname attr-list attrname attrvalue type)
+       (if (null entry)
+ 	  (progn
+ 	    (setq ret-attr '()
+ 		  attr-list diary-face-attrs)
+ 	    (while attr-list
+ 	      (goto-char (point-min))
+ 	      (setq attr (car attr-list)
+ 		    regexp (nth 0 attr)
+ 		    regnum (nth 1 attr)
+ 		    attrname (nth 2 attr)
+ 		    type (nth 3 attr)
+ 		    regexp (concat diary-glob-file-regexp-prefix regexp))
+ 	      (setq attrvalue nil)
+ 	      (if (re-search-forward regexp (point-max) t)
+ 		  (setq attrvalue (buffer-substring-no-properties
+ 				   (match-beginning regnum)
+ 				   (match-end regnum))))
+ 	      (if (and attrvalue
+ 		       (setq attrvalue (diary-attrtype-convert attrvalue type)))
+ 		  (setq ret-attr (append ret-attr (list attrname attrvalue))))
+ 	      (setq attr-list (cdr attr-list)))
+ 	    (setq fileglobattrs ret-attr))
+ 	(progn
+ 	  (setq ret-attr fileglobattrs
+ 		attr-list diary-face-attrs)
+ 	  (while attr-list
+ 	    (goto-char (point-min))
+ 	    (setq attr (car attr-list)
+ 		  regexp (nth 0 attr)
+ 		  regnum (nth 1 attr)
+ 		  attrname (nth 2 attr)
+ 		  type (nth 3 attr))
+ 	    (setq attrvalue nil)
+ 	    (if (string-match regexp entry)
+ 		(progn 
+ 		  (setq attrvalue (substring-no-properties entry
+ 							   (match-beginning regnum)
+ 							   (match-end regnum)))
+ 		  (setq entry (replace-match "" t t entry))))
+ 	    (if (and attrvalue
+ 		     (setq attrvalue (diary-attrtype-convert attrvalue type)))
+ 		(setq ret-attr (append ret-attr (list attrname attrvalue))))
+ 	    (setq attr-list (cdr attr-list)))))))
+   (list entry ret-attr))
+   
+   
+ 
  (defun list-diary-entries (date number)
    "Create and display a buffer containing the relevant lines in diary-file.
  The arguments are DATE and NUMBER; the entries selected are those
  for NUMBER days starting with date DATE.  The other entries are hidden
***************
*** 222,229 ****
--- 299,307 ----
    (if (< 0 number)
        (let* ((original-date date);; save for possible use in the hooks
               old-diary-syntax-table
               diary-entries-list
+ 	     file-glob-attrs
               (date-string (calendar-date-string date))
               (d-file (substitute-in-file-name diary-file)))
          (message "Preparing diary...")
          (save-excursion
***************
*** 232,239 ****
--- 310,318 ----
  		(set-buffer (find-file-noselect d-file t))
  	      (set-buffer diary-buffer)
  	      (or (verify-visited-file-modtime diary-buffer)
  		  (revert-buffer t t))))
+ 	  (setq file-glob-attrs (nth 1 (diary-pull-attrs nil "")))
            (setq selective-display t)
            (setq selective-display-ellipses nil)
            (setq old-diary-syntax-table (syntax-table))
            (set-syntax-table diary-syntax-table)
***************
*** 307,327 ****
                                 (re-search-forward "\^M\\|\n" nil t))
                               (backward-char 1)
                               (subst-char-in-region date-start
                                  (point) ?\^M ?\n t)
                               (add-to-diary-list
                                date
!                               (buffer-substring
!                                entry-start (point))
                                (buffer-substring
                                 (1+ date-start) (1- entry-start))
! 			      (copy-marker entry-start))))))
                       (setq d (cdr d)))
                     (or entry-found
                         (not diary-list-include-blanks)
                         (setq diary-entries-list
                               (append diary-entries-list
!                                      (list (list date "" "")))))
                     (setq date
                           (calendar-gregorian-from-absolute
                             (1+ (calendar-absolute-from-gregorian date))))
                     (setq entry-found nil)))
--- 386,409 ----
                                 (re-search-forward "\^M\\|\n" nil t))
                               (backward-char 1)
                               (subst-char-in-region date-start
                                  (point) ?\^M ?\n t)
+ 			     (setq entry (buffer-substring entry-start (point))
+ 				   temp (diary-pull-attrs entry file-glob-attrs)
+ 				   entry (nth 0 temp)
+ 				   marks (nth 1 temp))
                               (add-to-diary-list
                                date
! 			      entry
                                (buffer-substring
                                 (1+ date-start) (1- entry-start))
! 			      (copy-marker entry-start) marks)))))
                       (setq d (cdr d)))
                     (or entry-found
                         (not diary-list-include-blanks)
                         (setq diary-entries-list
                               (append diary-entries-list
!                                      (list (list date "" "" "" "")))))
                     (setq date
                           (calendar-gregorian-from-absolute
                             (1+ (calendar-absolute-from-gregorian date))))
                     (setq entry-found nil)))
***************
*** 512,526 ****
  					 x)
                                         date-holiday-list
                                         (concat "\n" (make-string l ? ))))
                      (insert ?\n (make-string (+ l longest) ?=) ?\n)))))
!           (if (< 0 (length (car (cdr (car entry-list)))))
! 	      (if (nth 3 (car entry-list))
! 		  (insert-button (concat (car (cdr (car entry-list))) "\n")
! 				 'marker (nth 3 (car entry-list))
! 				 :type 'diary-entry)
! 		(insert (car (cdr (car entry-list))) ?\n)))
!           (setq entry-list (cdr entry-list))))
        (set-buffer-modified-p nil)
        (goto-char (point-min))
        (setq buffer-read-only t)
        (display-buffer fancy-diary-buffer)
--- 594,628 ----
  					 x)
                                         date-holiday-list
                                         (concat "\n" (make-string l ? ))))
                      (insert ?\n (make-string (+ l longest) ?=) ?\n)))))
! 
! 	  (setq entry (car (cdr (car entry-list))))
! 	  (if (< 0 (length entry))
! 	      (progn
! 		(if (nth 3 (car entry-list))
! 		    (insert-button (concat entry "\n")
! 				   'marker (nth 3 (car entry-list))
! 				   :type 'diary-entry)
! 		  (insert entry ?\n))
! 		(save-excursion
! 		  (setq marks (fifth (car entry-list)))
! 		  (setq temp-face (make-symbol (apply 'concat "temp-face-" (mapcar '(lambda (sym) (if (not (stringp sym)) (symbol-name sym) sym)) marks))))
! 		  (make-face temp-face)
! 		  ;; Remove :face info from the marks, copy the face info into temp-face
! 		  (setq faceinfo marks)
! 		  (while (setq faceinfo (memq :face faceinfo))
! 		    (copy-face (read (nth 1 faceinfo)) temp-face)
! 		    (setcar faceinfo nil)
! 		    (setcar (cdr faceinfo) nil))
! 		  (setq marks (delq nil marks))
! 		  ;; Apply the font aspects
! 		  (apply 'set-face-attribute temp-face nil marks)
! 		  (search-backward entry)
! 		  (overlay-put
! 		   (make-overlay (match-beginning 0) (match-end 0)) 'face temp-face))
! 		))
! 	  (setq entry-list (cdr entry-list))))
        (set-buffer-modified-p nil)
        (goto-char (point-min))
        (setq buffer-read-only t)
        (display-buffer fancy-diary-buffer)
***************
*** 689,703 ****
  After the entries are marked, the hooks `nongregorian-diary-marking-hook' and
  `mark-diary-entries-hook' are run."
    (interactive)
    (setq mark-diary-entries-in-calendar t)
!   (let ((d-file (substitute-in-file-name diary-file))
          (marking-diary-entries t))
      (if (and d-file (file-exists-p d-file))
          (if (file-readable-p d-file)
              (save-excursion
                (message "Marking diary entries...")
                (set-buffer (find-file-noselect d-file t))
                (let ((d diary-date-forms)
                      (old-diary-syntax-table))
                  (setq old-diary-syntax-table (syntax-table))
                  (set-syntax-table diary-syntax-table)
--- 791,807 ----
  After the entries are marked, the hooks `nongregorian-diary-marking-hook' and
  `mark-diary-entries-hook' are run."
    (interactive)
    (setq mark-diary-entries-in-calendar t)
!   (let (file-glob-attrs
! 	(d-file (substitute-in-file-name diary-file))
          (marking-diary-entries t))
      (if (and d-file (file-exists-p d-file))
          (if (file-readable-p d-file)
              (save-excursion
                (message "Marking diary entries...")
                (set-buffer (find-file-noselect d-file t))
+ 	      (setq file-glob-attrs (nth 1 (diary-pull-attrs nil '())))
                (let ((d diary-date-forms)
                      (old-diary-syntax-table))
                  (setq old-diary-syntax-table (syntax-table))
                  (set-syntax-table diary-syntax-table)
***************
*** 773,801 ****
                                               (- y 100)
                                             (if (> (- current-y y) 50)
                                                 (+ y 100)
                                               y)))
!                                      (string-to-int y-str)))))
!                         (if dd-name
!                             (mark-calendar-days-named
!                              (cdr (assoc-ignore-case
!                                    (substring dd-name 0 3)
!                                    (calendar-make-alist
!                                     calendar-day-name-array
!                                     0
!                                     (lambda (x) (substring x 0 3))))))
!                           (if mm-name
!                               (if (string-equal mm-name "*")
!                                   (setq mm 0)
!                                 (setq mm
!                                       (cdr (assoc-ignore-case
!                                             (substring mm-name 0 3)
!                                             (calendar-make-alist
!                                              calendar-month-name-array
!                                              1
!                                              (lambda (x) (substring x 0 3)))
!                                             )))))
!                           (mark-calendar-date-pattern mm dd yy))))
                      (setq d (cdr d))))
                  (mark-sexp-diary-entries)
                  (run-hooks 'nongregorian-diary-marking-hook
                             'mark-diary-entries-hook)
--- 877,910 ----
                                               (- y 100)
                                             (if (> (- current-y y) 50)
                                                 (+ y 100)
                                               y)))
!                                      (string-to-int y-str))))
! 			     (save-excursion
! 			       (setq entry (buffer-substring-no-properties (point) (line-end-position))
! 				     temp (diary-pull-attrs entry file-glob-attrs)
! 				     entry (nth 0 temp)
! 				     marks (nth 1 temp))))
! 			(if dd-name
! 			    (mark-calendar-days-named
! 			     (cdr (assoc-ignore-case
! 				   (substring dd-name 0 3)
! 				   (calendar-make-alist
! 				    calendar-day-name-array
! 				    0
! 				    (lambda (x) (substring x 0 3))))) marks)
! 			  (if mm-name
! 			      (if (string-equal mm-name "*")
! 				  (setq mm 0)
! 				(setq mm
! 				      (cdr (assoc-ignore-case
! 					    (substring mm-name 0 3)
! 					    (calendar-make-alist
! 					     calendar-month-name-array
! 					     1
! 					     (lambda (x) (substring x 0 3)))
! 					    )))))
! 			  (mark-calendar-date-pattern mm dd yy marks))))
                      (setq d (cdr d))))
                  (mark-sexp-diary-entries)
                  (run-hooks 'nongregorian-diary-marking-hook
                             'mark-diary-entries-hook)
***************
*** 816,824 ****
           (m)
           (y)
           (first-date)
           (last-date)
!          (mark))
      (save-excursion
        (set-buffer calendar-buffer)
        (setq m displayed-month)
        (setq y displayed-year))
--- 925,935 ----
           (m)
           (y)
           (first-date)
           (last-date)
!          (mark)
! 	 file-glob-attrs)
!     (setq file-glob-attrs (nth 1 (diary-pull-attrs nil '())))
      (save-excursion
        (set-buffer calendar-buffer)
        (setq m displayed-month)
        (setq y displayed-year))
***************
*** 866,877 ****
              (aset entry (match-beginning 0) ?\n )))
          (calendar-for-loop date from first-date to last-date do
            (if (setq mark (diary-sexp-entry sexp entry
                                  (calendar-gregorian-from-absolute date)))
!               (mark-visible-calendar-date
!                (calendar-gregorian-from-absolute date)
!                (if (consp mark)
!                    (car mark)))))))))
  
  (defun mark-included-diary-files ()
    "Mark the diary entries from other diary files with those of the diary file.
  This function is suitable for use as the `mark-diary-entries-hook'; it enables
--- 977,994 ----
              (aset entry (match-beginning 0) ?\n )))
          (calendar-for-loop date from first-date to last-date do
            (if (setq mark (diary-sexp-entry sexp entry
                                  (calendar-gregorian-from-absolute date)))
! 	      (progn
! 		(setq marks (diary-pull-attrs entry file-glob-attrs)
! 		      temp (diary-pull-attrs entry file-glob-attrs)
! 		      marks (nth 1 temp))
! 		(mark-visible-calendar-date
! 		 (calendar-gregorian-from-absolute date) 
! 		 (if (< 0 (length marks))
! 		     marks
! 		   (if (consp mark)
! 		     (car mark)))))))))))
  
  (defun mark-included-diary-files ()
    "Mark the diary entries from other diary files with those of the diary file.
  This function is suitable for use as the `mark-diary-entries-hook'; it enables
***************
*** 904,912 ****
          (message "Can't find included diary file %s" diary-file)
          (sleep-for 2))))
    (goto-char (point-min)))
  
! (defun mark-calendar-days-named (dayname)
    "Mark all dates in the calendar window that are day DAYNAME of the week.
  0 means all Sundays, 1 means all Mondays, and so on."
    (save-excursion
      (set-buffer calendar-buffer)
--- 1021,1029 ----
          (message "Can't find included diary file %s" diary-file)
          (sleep-for 2))))
    (goto-char (point-min)))
  
! (defun mark-calendar-days-named (dayname &optional color)
    "Mark all dates in the calendar window that are day DAYNAME of the week.
  0 means all Sundays, 1 means all Mondays, and so on."
    (save-excursion
      (set-buffer calendar-buffer)
***************
*** 922,945 ****
                   (calendar-nth-named-day 1 dayname prev-month prev-year)))
        (setq last-day (calendar-absolute-from-gregorian
                   (calendar-nth-named-day -1 dayname succ-month succ-year)))
        (while (<= day last-day)
!         (mark-visible-calendar-date (calendar-gregorian-from-absolute day))
          (setq day (+ day 7))))))
  
! (defun mark-calendar-date-pattern (month day year)
    "Mark all dates in the calendar window that conform to MONTH/DAY/YEAR.
  A value of 0 in any position is a wildcard."
    (save-excursion
      (set-buffer calendar-buffer)
      (let ((m displayed-month)
            (y displayed-year))
        (increment-calendar-month m y -1)
        (calendar-for-loop i from 0 to 2 do
!           (mark-calendar-month m y month day year)
            (increment-calendar-month m y 1)))))
  
! (defun mark-calendar-month (month year p-month p-day p-year)
    "Mark dates in the MONTH/YEAR that conform to pattern P-MONTH/P_DAY/P-YEAR.
  A value of 0 in any position of the pattern is a wildcard."
    (if (or (and (= month p-month)
                 (or (= p-year 0) (= year p-year)))
--- 1039,1062 ----
                   (calendar-nth-named-day 1 dayname prev-month prev-year)))
        (setq last-day (calendar-absolute-from-gregorian
                   (calendar-nth-named-day -1 dayname succ-month succ-year)))
        (while (<= day last-day)
!         (mark-visible-calendar-date (calendar-gregorian-from-absolute day) color)
          (setq day (+ day 7))))))
  
! (defun mark-calendar-date-pattern (month day year &optional color)
    "Mark all dates in the calendar window that conform to MONTH/DAY/YEAR.
  A value of 0 in any position is a wildcard."
    (save-excursion
      (set-buffer calendar-buffer)
      (let ((m displayed-month)
            (y displayed-year))
        (increment-calendar-month m y -1)
        (calendar-for-loop i from 0 to 2 do
!           (mark-calendar-month m y month day year color)
            (increment-calendar-month m y 1)))))
  
! (defun mark-calendar-month (month year p-month p-day p-year &optional color)
    "Mark dates in the MONTH/YEAR that conform to pattern P-MONTH/P_DAY/P-YEAR.
  A value of 0 in any position of the pattern is a wildcard."
    (if (or (and (= month p-month)
                 (or (= p-year 0) (= year p-year)))
***************
*** 947,956 ****
                 (or (= p-year 0) (= year p-year))))
        (if (= p-day 0)
            (calendar-for-loop
                i from 1 to (calendar-last-day-of-month month year) do
!             (mark-visible-calendar-date (list month i year)))
!         (mark-visible-calendar-date (list month p-day year)))))
  
  (defun sort-diary-entries ()
    "Sort the list of diary entries by time of day."
    (setq diary-entries-list (sort diary-entries-list 'diary-entry-compare)))
--- 1064,1073 ----
                 (or (= p-year 0) (= year p-year))))
        (if (= p-day 0)
            (calendar-for-loop
                i from 1 to (calendar-last-day-of-month month year) do
!             (mark-visible-calendar-date (list month i year) color))
!         (mark-visible-calendar-date (list month p-day year) color))))
  
  (defun sort-diary-entries ()
    "Sort the list of diary entries by time of day."
    (setq diary-entries-list (sort diary-entries-list 'diary-entry-compare)))
***************
*** 1169,1178 ****
  best if they are nonmarking."
    (let* ((mark (regexp-quote diary-nonmarking-symbol))
           (sexp-mark (regexp-quote sexp-diary-entry-symbol))
           (s-entry (concat "\\(\\`\\|\^M\\|\n\\)" mark "?" sexp-mark "("))
!          (entry-found))
      (goto-char (point-min))
      (while (re-search-forward s-entry nil t)
        (backward-char 1)
        (let ((sexp-start (point))
              (sexp)
--- 1286,1298 ----
  best if they are nonmarking."
    (let* ((mark (regexp-quote diary-nonmarking-symbol))
           (sexp-mark (regexp-quote sexp-diary-entry-symbol))
           (s-entry (concat "\\(\\`\\|\^M\\|\n\\)" mark "?" sexp-mark "("))
!          (entry-found)
! 	 (file-glob-attrs))
      (goto-char (point-min))
+     (save-excursion
+       (setq file-glob-attrs (nth 1 (diary-pull-attrs nil '()))))
      (while (re-search-forward s-entry nil t)
        (backward-char 1)
        (let ((sexp-start (point))
              (sexp)
***************
*** 1203,1219 ****
            (setq entry (buffer-substring-no-properties entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
          (let ((diary-entry (diary-sexp-entry sexp entry date)))
            (if diary-entry
!               (subst-char-in-region line-start (point) ?\^M ?\n t))
!           (add-to-diary-list date
! 			     (if (consp diary-entry)
! 				 (cdr diary-entry)
! 			       diary-entry)
  			     specifier
  			     (if entry-start (copy-marker entry-start)
! 			       nil))
  	  (setq entry-found (or entry-found diary-entry)))))
      entry-found))
  
  (defun diary-sexp-entry (sexp entry date)
--- 1323,1346 ----
            (setq entry (buffer-substring-no-properties entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
          (let ((diary-entry (diary-sexp-entry sexp entry date)))
+ 	  (setq entry (if (consp diary-entry)
+ 			  (cdr diary-entry)
+ 			diary-entry))
            (if diary-entry
! 	      (progn
! 		(subst-char-in-region line-start (point) ?\^M ?\n t)
! 		(if (< 0 (length entry))
! 		    (setq temp (diary-pull-attrs entry file-glob-attrs)
! 			  entry (nth 0 temp)
! 			  marks (nth 1 temp)))))
! 	  (add-to-diary-list date
! 			     entry
  			     specifier
  			     (if entry-start (copy-marker entry-start)
! 			       nil) 
! 			     marks)
  	  (setq entry-found (or entry-found diary-entry)))))
      entry-found))
  
  (defun diary-sexp-entry (sexp entry date)
***************
*** 1469,1483 ****
       ((and (listp days) days)
        (or (diary-remind sexp (car days) marking)
            (diary-remind sexp (cdr days) marking))))))
  
! (defun add-to-diary-list (date string specifier marker)
!   "Add the entry (DATE STRING SPECIFIER) to `diary-entries-list'.
  Do nothing if DATE or STRING is nil."
    (and date string
         (setq diary-entries-list
               (append diary-entries-list
! 		     (list (list date string specifier marker))))))
  
  (defun make-diary-entry (string &optional nonmarking file)
    "Insert a diary entry STRING which may be NONMARKING in FILE.
  If omitted, NONMARKING defaults to nil and FILE defaults to diary-file."
--- 1596,1615 ----
       ((and (listp days) days)
        (or (diary-remind sexp (car days) marking)
            (diary-remind sexp (cdr days) marking))))))
  
! (defun add-to-diary-list (date string specifier marker &optional globcolor)
!   "Add the entry (DATE STRING SPECIFIER MARKER GLOBCOLOR) to `diary-entries-list'.
  Do nothing if DATE or STRING is nil."
    (and date string
+        (if (and diary-file-name-prefix
+ 		(setq prefix (concat "[" (funcall diary-file-name-prefix-function (buffer-file-name)) "] "))
+ 		(not (string= prefix "[] ")))
+ 	   (setq string (concat prefix string))
+ 	 t)
         (setq diary-entries-list
               (append diary-entries-list
! 		     (list (list date string specifier marker globcolor))))))
  
  (defun make-diary-entry (string &optional nonmarking file)
    "Insert a diary entry STRING which may be NONMARKING in FILE.
  If omitted, NONMARKING defaults to nil and FILE defaults to diary-file."

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: col-cal.patch --]
[-- Type: text/x-patch, Size: 5685 bytes --]

*** /home/fischman/cvs/emacs/lisp/calendar/calendar.el	2002-12-07 13:30:57.000000000 -0800
--- calendar.el	2002-12-19 09:53:59.000000000 -0800
***************
*** 309,316 ****
--- 309,321 ----
  calendar."
    :type 'boolean
    :group 'holidays)
  
+ (defcustom diary-file-name-prefix-function (function (lambda (str) str))
+   "*The function that will take a diary file name and return the desired prefix."
+   :type 'string
+   :group 'diary)
+ 
  ;;;###autoload
  (defcustom calendar-load-hook nil
    "*List of functions to be called after the calendar is first loaded.
  This is the place to add key bindings to `calendar-mode-map'."
***************
*** 496,503 ****
--- 501,538 ----
  See the documentation for the function `include-other-diary-files'."
    :type 'string
    :group 'diary)
  
+ (defcustom diary-glob-file-regexp-prefix "^\\#"
+   "*The regular expression that gets pre-pended to each of the attribute-regexp's for file-wide specifiers."
+   :type 'regexp
+   :group 'diary)
+ 
+ (defcustom diary-face-attrs '(
+ 			      (" *\\[foreground:\\([-a-z]+\\)\\]$" 1 :foreground string)
+ 			      (" *\\[background:\\([-a-z]+\\)\\]$" 1 :background string)
+ 			      (" *\\[width:\\([-a-z]+\\)\\]$" 1 :width symbol)
+ 			      (" *\\[height:\\([-0-9a-z]+\\)\\]$" 1 :height int)
+ 			      (" *\\[weight:\\([-a-z]+\\)\\]$" 1 :weight symbol)
+ 			      (" *\\[slant:\\([-a-z]+\\)\\]$" 1 :slant symbol)
+ 			      (" *\\[underline:\\([-a-z]+\\)\\]$" 1 :underline stringtnil)
+ 			      (" *\\[overline:\\([-a-z]+\\)\\]$" 1 :overline stringtnil)
+ 			      (" *\\[strike-through:\\([-a-z]+\\)\\]$" 1 :strike-through stringtnil)
+ 			      (" *\\[inverse-video:\\([-a-z]+\\)\\]$" 1 :inverse-video tnil)
+ 			      (" *\\[face:\\([-0-9a-z]+\\)\\]$" 1 :face string)
+ 			      (" *\\[font:\\([-a-z0-9]+\\)\\]$" 1 :font string)
+ ;Unsupported			      (" *\\[box:\\([-a-z]+\\)\\]$" 1 :box)
+ ;Unsupported			      (" *\\[stipple:\\([-a-z]+\\)\\]$" 1 :stipple)
+ 			      )
+   "*A list of (regexp regnum attr attrtype) lists where the regexp says how to find the tag, the regnum says which parenthetical sub-regexp this regexp looks for, and the attr says which attribute of the face (or that this _is_ a face) is being modified."
+   :type 'sexp
+   :group 'diary)
+ 
+ (defcustom diary-file-name-prefix nil
+   "If non-nil then each entry in the diary list will be prefixed with the name of the file in which it was defined."
+   :type 'boolean
+   :group 'diary)
+ 
  ;;;###autoload
  (defcustom sexp-diary-entry-symbol "%%"
    "*The string used to indicate a sexp diary entry in `diary-file'.
  See the documentation for the function `list-sexp-diary-entries'."
***************
*** 2552,2574 ****
     (= (extract-calendar-year date1) (extract-calendar-year date2))))
  
  (defun mark-visible-calendar-date (date &optional mark)
    "Mark DATE in the calendar window with MARK.
! MARK is either a single-character string or a face.
  MARK defaults to `diary-entry-marker'."
    (if (calendar-date-is-legal-p date)
        (save-excursion
          (set-buffer calendar-buffer)
          (calendar-cursor-to-visible-date date)
!         (let ((mark (or mark diary-entry-marker)))
!           (if (stringp mark)
!               (let ((buffer-read-only nil))
!                 (forward-char 1)
!                 (delete-char 1)
!                 (insert mark)
!                 (forward-char -2))
! 	    (overlay-put
!              (make-overlay (1- (point)) (1+ (point))) 'face mark))))))
  
  (defun calendar-star-date ()
    "Replace the date under the cursor in the calendar window with asterisks.
  This function can be used with the `today-visible-calendar-hook' run after the
--- 2587,2634 ----
     (= (extract-calendar-year date1) (extract-calendar-year date2))))
  
  (defun mark-visible-calendar-date (date &optional mark)
    "Mark DATE in the calendar window with MARK.
! MARK is a single-character string, a list of face attributes/values, or a face.
  MARK defaults to `diary-entry-marker'."
    (if (calendar-date-is-legal-p date)
        (save-excursion
          (set-buffer calendar-buffer)
          (calendar-cursor-to-visible-date date)
! 	(let ((mark (or (and (stringp mark) (= (length mark) 1) mark) ; single-char
! 			(and (listp mark) (> (length mark) 0) mark) ; attr list
! 			(and (facep mark) mark) ; face-name
! 			diary-entry-marker)))
! 	  (if (facep mark)
! 	      (progn ; face or an attr-list that contained a face
! 		(overlay-put
! 		 (make-overlay (1- (point)) (1+ (point))) 'face mark))
! 	    (if (and (stringp mark)
! 		     (= (length mark) 1)) ; single-char
! 		(let ((buffer-read-only nil))
! 		  (forward-char 1)
! 		  (delete-char 1)
! 		  (insert mark)
! 		  (forward-char -2))
! 	      (progn ; attr list 
! 		(setq temp-face 
! 		      (make-symbol (apply 'concat "temp-face-" 
! 					  (mapcar '(lambda (sym) 
! 						     (cond ((symbolp sym) (symbol-name sym))
! 							   ((numberp sym) (int-to-string sym))
! 							   (t sym))) mark))))
! 		(make-face temp-face)
! 		;; Remove :face info from the mark, copy the face info into temp-face
! 		(setq faceinfo mark)
! 		(while (setq faceinfo (memq :face faceinfo))
! 		  (copy-face (read (nth 1 faceinfo)) temp-face)
! 		  (setcar faceinfo nil)
! 		  (setcar (cdr faceinfo) nil))
! 		(setq mark (delq nil mark))
! 		;; Apply the font aspects
! 		(apply 'set-face-attribute temp-face nil mark)
! 		(overlay-put
! 		 (make-overlay (1- (point)) (1+ (point))) 'face temp-face))))))))
  
  (defun calendar-star-date ()
    "Replace the date under the cursor in the calendar window with asterisks.
  This function can be used with the `today-visible-calendar-hook' run after the

[-- Attachment #4: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://mail.gnu.org/mailman/listinfo/emacs-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2002-12-19 18:03 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-12-11 23:58 specific coloring of diary calendar entries Ami Fischman
2002-12-12  1:02 ` Alan Shutko
2002-12-12 18:24   ` Ami Fischman
2002-12-12 18:56     ` Ami Fischman
2002-12-12 19:31     ` Alan Shutko
2002-12-13 10:14       ` Kai Großjohann
2002-12-14  1:05     ` Alan Shutko
2002-12-14  1:42       ` Miles Bader
2002-12-13 22:22 ` Richard Stallman
2002-12-13 23:37   ` Ami Fischman
2002-12-14  0:07     ` Alan Shutko
2002-12-15 23:39     ` Richard Stallman
2002-12-16  0:31       ` Alex Schroeder
2002-12-17 18:44         ` Richard Stallman
2002-12-17  6:18       ` Ami Fischman
2002-12-17  9:42         ` Alex Schroeder
2002-12-17 16:03           ` Alan Shutko
2002-12-17 11:05         ` Kai Großjohann
2002-12-17 16:02           ` Alan Shutko
2002-12-17 11:07         ` Kai Großjohann
2002-12-18  2:01         ` Richard Stallman
2002-12-18 22:27           ` Ami Fischman
2002-12-19  6:02             ` Ami Fischman
2002-12-19 18:03               ` Ami Fischman

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).