在Emacs中,当您使用M-x calendar
显示日历时,您将获得一个为期三个月的展示 - 上个月,本月和下个月 - 在一个只有8行高的新窗口中。
是否可以在全尺寸窗口中生成十二个月的日历?
答案 0 :(得分:5)
似乎没有一种简单的方法可以做到这一点。我能够敲掉下面的代码,它将在一个单独的框架中连续显示所有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)))
您可能需要稍微调整一下,具体取决于您的屏幕/字体大小。
答案 1 :(得分:4)
12个月日历 - 每月滚动(前进/后退)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 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))
答案 2 :(得分:0)
要做到这一点并不容易,生成日历的代码是:
(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 :(得分:0)
我修改了&#34; 12个月日历 - 每月滚动(前进/后退)&#34;回答并将其改编为Emacs post 23.3版本 - no calendar-for-loop
宏 - 并将滚动从一个月更改为一年。此版本显示当年的整个日历。向后移动<
并将>
转发一年。它不会在全屏显示,而是半屏,这使得在处理垂直分割时易于使用,而且它更像是日历中的扩展版本。
(defun jarfar/year-calendar (&optional year) "Generate a one year calendar that can be scrolled by year in each direction. This is a modification of: http://homepage3.nifty.com/oatu/emacs/calendar.html See also: https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months" (interactive) (require 'calendar) (let* ( (current-year (number-to-string (nth 5 (decode-time (current-time))))) (month 0) (year (if year year (string-to-number (format-time-string "%Y" (current-time)))))) (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 (dotimes (j 4) ;; vertical columns (dotimes (i 3) (calendar-generate-month (setq month (+ month 1)) 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 jarfar/scroll-year-calendar-forward (&optional arg event) "Scroll the yearly calendar by year in a forward direction." (interactive (list (prefix-numeric-value current-prefix-arg) last-nonmenu-event)) (unless arg (setq arg 0)) (save-selected-window (if (setq event (event-start event)) (select-window (posn-window event))) (unless (zerop arg) (let* ( (year (+ displayed-year arg))) (jarfar/year-calendar year))) (goto-char (point-min)) (run-hooks 'calendar-move-hook))) (defun jarfar/scroll-year-calendar-backward (&optional arg event) "Scroll the yearly calendar by year in a backward direction." (interactive (list (prefix-numeric-value current-prefix-arg) last-nonmenu-event)) (jarfar/scroll-year-calendar-forward (- (or arg 1)) event)) (define-key calendar-mode-map "" 'jarfar/scroll-year-calendar-forward) (defalias 'year-calendar #'jarfar/year-calendar)