1

我正在寻找一种在议程视图和日历中选择nextprevious月份的方法。我编写了一个概念/原型函数(如下),但它不计算nextprevious几个月,我还需要每个月重写该函数。

的日期格式org-agenda-month-view不同于 的日期格式calendar-other-month。下面是一些与我想要完成的功能相关的功能——例如,日历已经能够按月向前或向后移动。

next我认为可能需要一个功能来识别正在查看的月份,然后在点击或previous按钮时添加一个月的正负(以正确的格式) 。

(defun lawlist-org-agenda-view-mode-dispatch ()
  "Select the month in agenda view."
  (interactive)
  (message "View: [7] JUL | [8] AUG | [9] SEP | [o]CT | [n]OV | [d]EC ")
  (let ((a (read-char-exclusive)))
    (case a
      (?7
        (org-agenda nil "a")
        (org-agenda-month-view 201307)
        (calendar)
        (calendar-other-month 7 2013)
        (lawlist-org-agenda-view-mode-dispatch))
      (?8
        (org-agenda nil "a")
        (org-agenda-month-view 201308)
        (calendar)
        (calendar-other-month 8 2013)
        (lawlist-org-agenda-view-mode-dispatch))
      (?9
        (org-agenda nil "a")
        (org-agenda-month-view 201309)
        (calendar)
        (calendar-other-month 9 2013)
        (lawlist-org-agenda-view-mode-dispatch))
      (?o
        (org-agenda nil "a")
        (org-agenda-month-view 201310)
        (calendar)
        (calendar-other-month 10 2013)
        (lawlist-org-agenda-view-mode-dispatch))
      (?n
        (org-agenda nil "a")
        (org-agenda-month-view 201311)
        (calendar)
        (calendar-other-month 11 2013)
        (lawlist-org-agenda-view-mode-dispatch))
      (?d
        (org-agenda nil "a")
        (org-agenda-month-view 201312)
        (calendar)
        (calendar-other-month 12 2013)
        (lawlist-org-agenda-view-mode-dispatch))
      (?q (message "Abort"))
      (otherwise (error "Either press \"q\" to quit, or select another option." )))))

以下是我从cal-move.eland中提取的一些相关函数calendar.el

(defun calendar-other-month (month year &optional event)
  "Display a three-month calendar centered around MONTH and YEAR.
EVENT is an event like `last-nonmenu-event'."
  (interactive (let ((event (list last-nonmenu-event)))
                 (append (calendar-read-date 'noday) event)))
  (save-selected-window
    (and event
         (setq event (event-start event))
         (select-window (posn-window event)))
    (unless (and (= month displayed-month)
                 (= year displayed-year))
      (let ((old-date (calendar-cursor-to-date))
            (today (calendar-current-date)))
        (calendar-generate-window month year)
        (calendar-cursor-to-visible-date
         (cond
          ((calendar-date-is-visible-p old-date) old-date)
          ((calendar-date-is-visible-p today) today)
          (t (list month 1 year))))))))

;;;###cal-autoload
(defun calendar-forward-month (arg)
  "Move the cursor forward ARG months.
Movement is backward if ARG is negative."
  (interactive "p")
  (calendar-cursor-to-nearest-date)
  (let* ((cursor-date (calendar-cursor-to-date t))
         (month (calendar-extract-month cursor-date))
         (day (calendar-extract-day cursor-date))
         (year (calendar-extract-year cursor-date))
         (last (progn
                 (calendar-increment-month month year arg)
                 (calendar-last-day-of-month month year)))
         (day (min last day))
         ;; Put the new month on the screen, if needed, and go to the new date.
         (new-cursor-date (list month day year)))
    (if (not (calendar-date-is-visible-p new-cursor-date))
        (calendar-other-month month year))
    (calendar-cursor-to-visible-date new-cursor-date))
  (run-hooks 'calendar-move-hook))

;;;###cal-autoload
(defun calendar-backward-month (arg)
  "Move the cursor backward by ARG months.
Movement is forward if ARG is negative."
  (interactive "p")
  (calendar-forward-month (- arg)))

;;;###cal-autoload
(defun calendar-forward-year (arg)
  "Move the cursor forward by ARG years.
Movement is backward if ARG is negative."
  (interactive "p")
  (calendar-forward-month (* 12 arg)))

;;;###cal-autoload
(defun calendar-backward-year (arg)
  "Move the cursor backward ARG years.
Movement is forward is ARG is negative."
  (interactive "p")
  (calendar-forward-month (* -12 arg)))

;;;###cal-autoload
(defun calendar-scroll-left (&optional arg event)
  "Scroll the displayed calendar left by ARG months.
If ARG is negative the calendar is scrolled right.  Maintains the relative
position of the cursor with respect to the calendar as well as possible.
EVENT is an event like `last-nonmenu-event'."
  (interactive (list (prefix-numeric-value current-prefix-arg)
                     last-nonmenu-event))
  (unless arg (setq arg 1))
  (save-selected-window
    ;; Nil if called from menu-bar.
    (if (setq event (event-start event)) (select-window (posn-window event)))
    (calendar-cursor-to-nearest-date)
    (unless (zerop arg)
      (let ((old-date (calendar-cursor-to-date))
            (today (calendar-current-date))
            (month displayed-month)
            (year displayed-year))
        (calendar-increment-month month year arg)
        (calendar-generate-window month year)
        (calendar-cursor-to-visible-date
         (cond
          ((calendar-date-is-visible-p old-date) old-date)
          ((calendar-date-is-visible-p today) today)
          (t (list month 1 year))))))
    (run-hooks 'calendar-move-hook)))

(define-obsolete-function-alias
  'scroll-calendar-left 'calendar-scroll-left "23.1")

;;;###cal-autoload
(defun calendar-scroll-right (&optional arg event)
  "Scroll the displayed calendar window right by ARG months.
If ARG is negative the calendar is scrolled left.  Maintains the relative
position of the cursor with respect to the calendar as well as possible.
EVENT is an event like `last-nonmenu-event'."
  (interactive (list (prefix-numeric-value current-prefix-arg)
                     last-nonmenu-event))
  (calendar-scroll-left (- (or arg 1)) event))

(define-obsolete-function-alias
  'scroll-calendar-right 'calendar-scroll-right "23.1")
4

1 回答 1

1

这是我的看法:

(defvar lawlist-month)

(defun lawlist-org-agenda-view-mode-dispatch ()
  "Select the month in agenda view."
  (interactive)
  (message "View: [1-9] [o]CT [n]OV [d]EC, j(next), k(prev).")
  (let* ((a (read-char-exclusive))
         (month (case a
                  (?o 10)
                  (?n 11)
                  (?d 12)
                  (?j (or (and lawlist-month (mod (1+ lawlist-month) 12)) 1))
                  (?k (or (and lawlist-month (mod (1- lawlist-month) 12)) 1))
                  (t (and (> a ?0) (<= a ?9) (- a ?0))))))
    (if (setq lawlist-month month)
        (let ((year (nth 5 (decode-time (current-time)))))
           (org-agenda nil "a")
           (org-agenda-month-view
            (read (format "%d%02d" year month)))
           (calendar)
           (calendar-other-month month year)
           (lawlist-org-agenda-view-mode-dispatch))
      (message "Aborted"))))

它仍然缺少一些功能,例如保存窗口配置和中止恢复。

UPD

更新后的代码可以在这个gist中找到。除了当前,我还添加了其他年份,多年来一直支持 j/k 和 h/l。

于 2013-07-17T07:33:05.187 回答