emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: John Lee <jjl@pobox.com>
To: emacs-orgmode@gnu.org
Subject: Re: Mark vacation days
Date: Sun, 03 Feb 2019 14:49:24 +0000	[thread overview]
Message-ID: <1549205364.1198509.1649812088.706E7D4F@webmail.messagingengine.com> (raw)
In-Reply-To: <25cGT-vHP6TRHpUf59QT6DPhIS6TBUAg6PcYJq4Fy6xvPgUCL-SPVnFBGyLY6F31fO2wn6j7PKPouypYiR1qB0mXpOXied-NVG7q7vLfvTY=@protonmail.com>

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 <jarss@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	other threads:[~2019-02-03 14:59 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-27 15:20 Mark vacation days JRSS
2019-01-27 19:27 ` Ken Mankoff
2019-01-27 20:20   ` JRSS
2019-01-27 20:35     ` Ken Mankoff
2019-01-27 20:41       ` JRSS
2019-02-03 14:49         ` John Lee [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1549205364.1198509.1649812088.706E7D4F@webmail.messagingengine.com \
    --to=jjl@pobox.com \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.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).