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 ;; http://stackoverflow.com/questions/23378271/how-do-i-display-ansi-color-codes-in-emacs-for-any-mode (require 'ansi-color) (defun display-ansi-colors () (interactive) (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*." (interactive) ;; 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 (switch-to-buffer tmp-buff-name) ;; turn off read only to overwrite if buffer exists (read-only-mode -1) ;; clear buffer (erase-buffer) ;; insert agenda file (insert-file-contents cal-file) ;; turn on colours (display-ansi-colors) ;; turn on special mode (special-mode) ;; turn off line wrapping (visual-line-mode -1)))
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: