2012-03-03 10 views
7

Emacs में, जब आप कैलेंडर को M-x calendar के साथ प्रदर्शित करते हैं, तो आपको तीन महीने का डिस्प्ले मिलता है - पिछले महीने, इस महीने और अगले महीने - एक नई विंडो में जो केवल 8 लाइनें लंबी होती है।Emacs कैलेंडर: 3 महीने से अधिक दिखाएं?

क्या पूर्ण आकार की विंडो में बारह महीने का कैलेंडर उत्पन्न करना संभव है?

उत्तर

5

ऐसा करने का एक आसान तरीका प्रतीत नहीं होता है। मैं निम्नलिखित कोड को दस्तक देने में सक्षम था, जो एक पंक्ति में सभी बारह महीनों को एक अलग फ्रेम में दिखाएगा।

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

आपको अपनी स्क्रीन/फ़ॉन्ट आकार के आधार पर इसे थोड़ा सा ट्विक करने की आवश्यकता हो सकती है।

+0

आपको 2012 के रूप में साल में कड़ी मेहनत की गई प्रतीत होती है? ऐसा कुछ बेहतर हो सकता है: '(स्ट्रिंग-टू-नंबर (प्रारूप-समय-स्ट्रिंग"% वाई "(वर्तमान समय))) – phils

+0

हां, संपादित करने के लिए स्वतंत्र महसूस करें। –

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

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

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 ने कहा था।

+0

असल में, 3 महीने से अधिक उत्पन्न करना कठिन हिस्सा नहीं है - बिंदु को स्थानांतरित करने और छुट्टियों, जन्मदिनों और बैठकों के लिए ओवरले रखने और आगे और पीछे स्क्रॉल करने के लिए अर्ध-कठिन क्या है। 12 महीने के कैलेंडर के लिए एल्गोरिदम http://stackoverflow.com/a/21709710/2112489 और यहां http://stackoverflow.com/a/21834918/2112489 है। इस समय, कर्सर को 3 महीने या 12 महीने के कैलेंडर पर जाने के लिए केवल सार्वजनिक रूप से उपलब्ध एल्गोरिदम हैं। यदि आप अतिरिक्त एल्गोरिदम लिखने के इच्छुक हैं, तो यह एक अच्छा होगा :) – lawlist

संबंधित मुद्दे