I don't know a good way to do this out of the box.  Here are two ways you could 
go about it, but they both involve a bit of programming.  They would all use 
org-agenda-day-face-function similar to the code you already posted.

1. Least programming: Add emacs diary entries (rather than recording the days 
using org datestamps -- see 
 and adapt https://emacs.stackexchange.com/a/45778/5495 to check diary-lib.el 
instead of holidays.el .  Note this won't work by using the support for adding 
diary sexps directly to org files 
 without something extra, because then the diary sexp information is only in 
org, not in the emacs diary itself, so you can't just look in 
diary-entries-list.  All pretty confusing I know.

Untested (!) based on adapting the stack exchange answer above to extend that 
(which pulls in holiday.el holidays + tests whether the day is a weekend -- the 
following is intended to hint how to extend that to pull in diary-lib.el dates 

Note I'm guessing you'd have to set org-agenda-include-diary for this to work, 
but I have not tested this *at all*, so this really is all just a hint.  Also, 
watch out for the weird dependence of diary-lib.el on calendar-date-style.

(defface my/org-agenda-holiday '((t (:inherit default)))
  "Base face used in agenda for holidays, whether today's date or not."
  :group 'org-faces)
(defface my/org-agenda-holiday-not-today '((t (:inherit (my/org-agenda-holiday 
  "Face used in agenda for holidays other than for today's date."
  :group 'org-faces)
(defface my/org-agenda-holiday-today '((t (:inherit (my/org-agenda-holiday 
  "Face used in agenda for holidays for today's date."
  :group 'org-faces)

(defun my/in-diary-p (date)
  (car (alist-get date diary-entries-list nil nil #'equal)))

(defun my/day-face (day)
  (let* ((abs (calendar-absolute-from-gregorian day))
         (todayp (org-agenda-today-p abs))
         (day-of-week (calendar-day-of-week day))
         (holidayp (or
                    (= day-of-week 0) (= day-of-week 6)
                    (holiday-in-range abs abs)
                    (my/in-diary-p day))))
    (cond ((and todayp holidayp) 'my/org-agenda-holiday-today)
          (holidayp 'my/org-agenda-holiday-not-today)
          (todayp 'org-agenda-date-today)
          (t 'org-agenda-date))))
(setq org-agenda-day-face-function #'my/day-face)

2. Maybe nicer: write something similar to org-agenda-to-appt that generates a 
list of holiday days rather than appointments, then run that code from places 
like 'after-save-hook.  Then consult that list in your 

On Sun, 27 Jan 2019, at 20:41, JRSS wrote:
> What if you set the category in the function? So the function has 
> something like cond (( or (org-category vacation) (org-category f_event)
> (background: red))
> I obviously don't know how to write it, but the idea is that the 
> categories are already set in the function. I won't have many, three 
> tops, and I won't change them often -- no need to be fully dynamic.
> Sent from ProtonMail mobile
> -------- Original Message --------
> On Jan 27, 2019, 15:35, Ken Mankoff wrote:
> > Hi,
> >
> > On 2019-01-27 at 12:20 -0800, JRSS <ja...@protonmail.com> wrote...
> >> This is a bit over my head still. I'm trying to wrap my head around it.
> >>
> >> I see what it does (colors day-of-the-week 1 and day-of-the-week-3,
> >> which are Monday and Wednesday, red) but not sure how to tie it to a
> >> category (so say, category "vacation" would be red).
> >>
> >> Once I have the function do that, I can go in and change it so that
> >> different categories will be different colors.
> >
> > It's a bit over my head for this use case too. Sorry. When I saw it I 
> > thought the use case was a list of holidays, which is easier to implement. 
> > You could maintain this list in an easy-to-access format as a variable near 
> > where you implement this function. A dynamic list based on tagged Org items 
> > is certainly more complicated.
> >
> > -k.

Reply via email to