在Emacs中,当您使用M-x calendar
显示日历时,您会在上个月,本月和下个月获得三个月的显示 - 在只有8行高的新窗口中显示。Emacs日历:显示超过3个月?
是否可以在全尺寸窗口中生成12个月的日历?
在Emacs中,当您使用M-x calendar
显示日历时,您会在上个月,本月和下个月获得三个月的显示 - 在只有8行高的新窗口中显示。Emacs日历:显示超过3个月?
是否可以在全尺寸窗口中生成12个月的日历?
似乎没有一种简单的方法来做到这一点。我能够敲出下面的代码,它将在一个单独的框架中连续显示12个月。
(require 'cl)
(require 'calendar)
(defun twelve-month-calendar()
(interactive)
(let ((calendar-buffer (get-buffer-create "12-month calendar"))
(month 12)
(year 2012))
(set-buffer calendar-buffer)
(setq calendar-frame (make-frame))
(make-variable-buffer-local 'font-lock-face)
(set-face-attribute 'default calendar-frame :height 70)
(set-frame-width calendar-frame 300)
(erase-buffer)
(dotimes (i 12)
(calendar-generate-month month year 0)
(calendar-increment-month month year -1))
(calendar-mode)))
根据您的屏幕/字体大小,您可能需要稍微调整一下。
12个月的日历 - 滚动BY MONTH(向前/向后)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Scroll a yearly calendar by month -- in a forwards or backwards direction. ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(eval-after-load "calendar" '(progn
(define-key calendar-mode-map "<" 'lawlist-scroll-year-calendar-backward)
(define-key calendar-mode-map ">" 'lawlist-scroll-year-calendar-forward)))
(defun year-calendar (&optional month year)
"Generate a one (1) year calendar that can be scrolled by month in each direction.
This is a modification of: http://homepage3.nifty.com/oatu/emacs/calendar.html
See also: http://ivan.kanis.fr/caly.el"
(interactive)
(require 'calendar)
(let* (
(current-year (number-to-string (nth 5 (decode-time (current-time)))))
(month (if month month
(string-to-number
(read-string "Please enter a month number (e.g., 1): " nil nil "1"))))
(year (if year year
(string-to-number
(read-string "Please enter a year (e.g., 2014): "
nil nil current-year)))))
(switch-to-buffer (get-buffer-create calendar-buffer))
(when (not (eq major-mode 'calendar-mode))
(calendar-mode))
(setq displayed-month month)
(setq displayed-year year)
(setq buffer-read-only nil)
(erase-buffer)
;; horizontal rows
(calendar-for-loop j from 0 to 3 do
;; vertical columns
(calendar-for-loop i from 0 to 2 do
(calendar-generate-month
;; month
(cond
((> (+ (* j 3) i month) 12)
(- (+ (* j 3) i month) 12))
(t
(+ (* j 3) i month)))
;; year
(cond
((> (+ (* j 3) i month) 12)
(+ year 1))
(t
year))
;; indentation/spacing between months
(+ 5 (* 25 i))))
(goto-char (point-max))
(insert (make-string (- 10 (count-lines (point-min) (point-max))) ?\n))
(widen)
(goto-char (point-max))
(narrow-to-region (point-max) (point-max)))
(widen)
(goto-char (point-min))
(setq buffer-read-only t)))
(defun lawlist-scroll-year-calendar-forward (&optional arg event)
"Scroll the yearly calendar by month in a forward direction."
(interactive (list (prefix-numeric-value current-prefix-arg)
last-nonmenu-event))
(unless arg (setq arg 1))
(save-selected-window
(if (setq event (event-start event)) (select-window (posn-window event)))
(unless (zerop arg)
(let* (
(month displayed-month)
(year displayed-year))
(calendar-increment-month month year arg)
(year-calendar month year)))
(goto-char (point-min))
(run-hooks 'calendar-move-hook)))
(defun lawlist-scroll-year-calendar-backward (&optional arg event)
"Scroll the yearly calendar by month in a backward direction."
(interactive (list (prefix-numeric-value current-prefix-arg)
last-nonmenu-event))
(lawlist-scroll-year-calendar-forward (- (or arg 1)) event))
这并不容易做到这一点,以产生日程的代码是:
(defun calendar-generate (month year)
"Generate a three-month Gregorian calendar centered around MONTH, YEAR."
;; A negative YEAR is interpreted as BC; -1 being 1 BC, and so on.
;; Note that while calendars for years BC could be displayed as it
;; stands, almost all other calendar functions (eg holidays) would
;; at best have unpredictable results for such dates.
(if (< (+ month (* 12 (1- year))) 2)
(error "Months before January, 1 AD cannot be displayed"))
(setq displayed-month month
displayed-year year)
(erase-buffer)
(calendar-increment-month month year -1)
(dotimes (i 3)
(calendar-generate-month month year
(+ calendar-left-margin
(* calendar-month-width i)))
(calendar-increment-month month year 1)))
在这里,(dotimes (i 3) ...)
连续产生3个月。
因此,如果您想要在超过1行中生成超过3个月,则必须自行覆盖calendar-generate
函数,与@Luke所说的相同。
实际上,生成超过3个月不是困难的部分 - 算法将点移动到日期并为节假日,生日和会议放置覆盖,并向前和向后滚动。 12个月的日历的算法在这里http://stackoverflow.com/a/21709710/2112489和这里http://stackoverflow.com/a/21834918/2112489。目前,只有公开的算法才能在3个月或12个月的日历上移动光标。如果你倾向于编写额外的算法,那将是一个伟大的:) – lawlist 2015-06-29 06:03:58
您似乎已将2012年的年份硬编码?像这样的可能是更好的:'(字符串到数字(格式 - 时间字符串“%Y”(当前时间)))' – phils 2012-03-04 01:50:09
是的,随意编辑。 – 2012-03-04 13:54:01