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 
https://www.gnu.org/software/emacs/manual/html_node/emacs/Special-Diary-Entries.html)
 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 
(https://orgmode.org/manual/Weekly_002fdaily-agenda.html#Calendar_002fDiary-integration)
 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 
too):

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 
org-agenda-date))))
  "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 
org-agenda-date-today))))
  "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 
org-agenda-day-face-function.

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