JCS over on Irreal describes a couple of ways of syncing a google calendar with your org-mode agenda. I prefer to keep my google calendar separate from my agenda, as I use the latter to track tasks rather than appointments. I still want to see my google calendar agenda in Emacs though so I have a fairly simple work around.
I use gcalcli to access my google calendar from the command line, and run it as a cron job using
gcalcli agenda and redirecting the output to a file. Then in Emacs I have a simple function to display the contents of that file.
Firstly though, the output of
gcalcli contains ansi colour codes to colour-code the calendars in the agenda. Emacs won’t display these colours unless we tell it to. We use the following code to define a function
display-ansi-colors to do this for us (source):
;; define function to display ansi colours for a buffer
(defun display-ansi-colors ()
(ansi-color-apply-on-region (point-min) (point-max)))
Now, here is the code to display the agenda:
(defun bjm/open-gcal-agenda ()
"Open my google calendar agenda file. The agenda is displayed in the buffer *gcal*."
;; set name of calendar buffer and location of file containing my agenda
(let ((tmp-buff-name "*gcal*") (cal-file (expand-file-name "/homeb/bjm/tmp/gcal")))
;; switch to calendar buffer
;; turn off read only to overwrite if buffer exists
;; clear buffer
;; insert agenda file
;; turn on colours
;; turn on special mode
;; turn off line wrapping
There are a couple of points worth noting here…
Firstly, I could easily just call
gcalcli on a timer in Emacs, but I use the agenda file for other things so it is helpful to do that externally.
Secondly, after inserting the contents of the agenda file to the buffer I set it to special mode, which is basically a read only mode with some common key bindings, and is useful for buffers that are not associated with editing files. Related to this, I call the buffer
*gcal*, which follows the convention that buffers not associated with files have names starting and ending with
Now by calling my
bjm/open-gcal-agenda function, I see something like this: