2012-03-03 21 views
7

En Emacs, cuando visualiza el calendario con M-x calendar, obtiene una pantalla de tres meses, el mes pasado, este mes y el mes siguiente, en una nueva ventana de solo 8 líneas de alto.Calendario de Emacs: mostrar más de 3 meses?

¿Es posible generar un calendario de doce meses en una ventana de tamaño completo?

Respuesta

5

No parece haber una manera fácil de hacerlo. Pude llamar el siguiente código, que mostrará los doce meses, seguidos, en un marco por separado.

(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))) 

Es posible que deba ajustarlo un poco, dependiendo de su pantalla/tamaño de fuente.

+0

¿Parece que ha codificado el año como 2012? Algo como esto podría ser preferible: '(string-to-number (format-time-string"% Y "(current-time)))' – phils

+0

Sí, siéntase libre de editar. –

4

12 MESES Calendario - ROLLOS POR MES (adelante/atrás)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;; 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)) 

Example http://www.lawlist.com/images/calendar_example.png

0

No es fácil de hacer esto, el código para generar el calendario es:

(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))) 

Aquí, (dotimes (i 3) ...) generan 3 meses seguidos.

Por lo tanto, si desea generar más de 3 meses en más de 1 fila, debe anular la función calendar-generate usted mismo, al igual que @Luke dijo.

+0

En realidad, generar más de 3 meses no es la parte difícil, lo que es semi difícil son los algoritmos para mover el punto a la fecha y colocar superposiciones para las vacaciones, cumpleaños y reuniones, y desplazarse hacia adelante y hacia atrás. El algoritmo para el calendario de 12 meses está aquí http://stackoverflow.com/a/21709710/2112489 y aquí http://stackoverflow.com/a/21834918/2112489. En este momento, solo existen algoritmos disponibles públicamente para mover el cursor hasta la fecha en los calendarios de 3 meses o 12 meses. Si te inclinas a escribir algoritmos adicionales, sería genial :) – lawlist

Cuestiones relacionadas