Function: calendar-basic-setup
calendar-basic-setup is an interactive and byte-compiled function
defined in calendar.el.gz.
Signature
(calendar-basic-setup &optional ARG NODISPLAY)
Documentation
Create a three-month calendar.
If optional prefix argument ARG is non-nil, prompts for the month and year, else uses the current date. If NODISPLAY is non-nil, don't display the generated calendar.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/calendar/calendar.el.gz
(defun calendar-basic-setup (&optional arg nodisplay)
"Create a three-month calendar.
If optional prefix argument ARG is non-nil, prompts for the month
and year, else uses the current date. If NODISPLAY is non-nil, don't
display the generated calendar."
(interactive "P")
(let ((buff (current-buffer)))
(set-buffer (get-buffer-create calendar-buffer))
(calendar-mode)
(let* ((pop-up-windows t)
;; Not really needed now, but means we use exactly the same
;; behavior as before in the non-wide case (see below).
(split-height-threshold 1000)
(split-width-threshold calendar-split-width-threshold)
(date (if arg (calendar-read-date t)
(calendar-current-date)))
(month (calendar-extract-month date))
(year (calendar-extract-year date)))
(calendar-increment-month month year (- calendar-offset))
;; Display the buffer before calling calendar-generate-window so that it
;; can get a chance to adjust the window sizes to the frame size.
(unless nodisplay
;; We want a window configuration that looks something like
;; X X | Y
;; - -----
;; C Z | C
;; where C is the calendar, and the LHS is the traditional,
;; non-wide frame, and the RHS is the wide frame case.
;; We should end up in the same state regardless of whether the
;; windows were initially split or not.
;; Previously, we only thought about the non-wide case.
;; We could just set split-height-threshold to 1000, relying on
;; the fact that the window splitting treated a single window as
;; a special case and would always split it (vertically). The
;; same thing does not work in the wide-frame case, so now we do
;; the splitting by hand.
;; See discussion in bug#1806.
;; Actually, this still does not do quite the right thing in the
;; wide frame case if started from a configuration like the LHS.
;; Eg if you start with a non-wide frame, call calendar, then
;; make the frame wider. This one is problematic because you
;; might need to split a totally unrelated window. Oh well, it
;; seems unlikely, and perhaps respecting the original layout is
;; the right thing in that case.
;;
;; Is this a wide frame? If so, split it horizontally.
;; The following doesn't sound useful: If we split horizontally
;; here, the subsequent `pop-to-buffer' will likely split again
;; horizontally and we end up with three side-by-side windows.
(when (window-splittable-p (selected-window) t)
(split-window-right))
(pop-to-buffer calendar-buffer)
;; Has the window already been split vertically?
(when (and (not (window-dedicated-p))
(window-splittable-p (selected-window))
(window-full-height-p))
(let ((win (split-window-below)))
;; In the upper window, show whatever was visible before.
;; This looks better than using other-buffer.
(switch-to-buffer buff)
;; Switch to the lower window with the calendar buffer.
(select-window win))))
(calendar-generate-window month year)
(if (and calendar-view-diary-initially-flag
(calendar-date-is-visible-p date))
;; Do not clobber the calendar with the diary, if the diary
;; has previously been shown in the window that now shows the
;; calendar (bug#18381).
(let ((display-buffer-overriding-action
'(nil . ((inhibit-same-window . t)))))
(diary-view-entries)))))
(if calendar-view-holidays-initially-flag
(let* ((diary-buffer (diary-live-p))
(diary-window (if diary-buffer (get-buffer-window diary-buffer)))
(split-height-threshold (if diary-window 2 1000)))
;; FIXME display buffer?
(calendar-list-holidays)))
(run-hooks 'calendar-initial-window-hook))