Emacsでは、カレンダーをM-x calendar
で表示すると、先月、今月、翌月の3か月間の表示が、新しいウィンドウでわずか8行になります。Emacsカレンダー:3か月以上を表示していますか?
フルサイズのウィンドウで12か月のカレンダーを生成することはできますか?
Emacsでは、カレンダーをM-x calendar
で表示すると、先月、今月、翌月の3か月間の表示が、新しいウィンドウでわずか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ヶ月のカレンダー - MONTH BYスクロールする(転送します/ BACKWARDS)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 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
2012年はハードコードされているようですね。このようなものが望ましいかもしれません: '(文字列から数字へ(フォーマット時の文字列"%Y "(現在時刻)))' – phils
はい、自由に編集してください。 –