The following code binds RET in calendar mode to a function that opens an org agenda buffer for that day (or better that week).
(defun th-calendar-open-agenda () (interactive) (let* ((calendar-date (or ;; the date at point in the calendar buffer (calendar-cursor-to-date) ;; if there's none, use the curren date (calendar-current-date))) (day (time-to-days (encode-time 1 1 1 (second calendar-date) (first calendar-date) (third calendar-date)))) (calendar-buffer (current-buffer))) (org-agenda-list nil day) (select-window (get-buffer-window calendar-buffer)))) (define-key calendar-mode-map (kbd "RET") 'th-calendar-open-agenda)
And here’s a small minor mode which uses the function above to refresh the agenda buffer when you move point in the calendar buffer, so calendar and agenda stay in sync.
(define-minor-mode th-org-agenda-follow-calendar-mode "If enabled, each calendar movement will refresh the org agenda buffer." :lighter " OrgAgendaFollow" (if (not (eq major-mode 'calendar-mode)) (message "Cannot activate th-org-agenda-follow-calendar-mode in %s." major-mode) (if th-org-agenda-follow-calendar-mode (add-hook 'calendar-move-hook 'th-calendar-open-agenda) (remove-hook 'calendar-move-hook 'th-calendar-open-agenda)))) (add-hook 'calendar-mode-hook 'th-org-agenda-follow-calendar-mode)
Another thing I added to calendar is the display of the week-of-year in the mode-line.
(add-to-list 'calendar-mode-line-format '(let ((day (nth 1 date)) (month (nth 0 date)) (year (nth 2 date))) (format-time-string "Week of year: %V" (encode-time 1 1 1 day month year))))