(require 'cl-lib)
(defun calendar-mode-options ()
(setq calendar-left-margin 1)
(add-hook 'window-configuration-change-hook
'es-calendar-win-config-hook nil t))
(add-hook 'calendar-mode-hook 'calendar-mode-options)
(defun es-calendar-win-config-hook ()
(catch 'exit
(with-current-buffer
(or (get-buffer calendar-buffer)
(throw 'exit nil))
(dolist (win (get-buffer-window-list nil nil t))
(with-selected-window win
(let* (( max (+ (* 7 3 3)
(* 2 calendar-intermonth-spacing)
-1))
( left (max 0 (/ (- (window-body-width) max) 2))))
(dolist (ov (overlays-in (point-min) (point-max)))
(when (and (overlay-get ov 'left-center-margin)
(eq (selected-window)
(overlay-get ov 'window)))
(delete-overlay ov)))
(save-excursion
(goto-char (point-min))
(cl-loop for ov
= (make-overlay
(line-beginning-position)
(1+ (line-beginning-position)))
do (progn
(overlay-put ov 'window (selected-window))
(overlay-put ov 'display (make-string left ?\s ))
(overlay-put ov 'left-center-margin t)
)
while (zerop (forward-line))
))))))))
(defadvice calendar-generate (after center-calendar activate)
(es-calendar-win-config-hook))