Вставьте целый месяц дат в Emacs Lisp - PullRequest
7 голосов
/ 15 апреля 2009

Я немного программирую здесь и там в Emacs Lisp, но я не совсем уверен, как поступить с некоторыми вещами.

Я пытаюсь вставить целый месяц дат, каждая в новой строке, как показано в списке ниже:

Январь

01/01/09 Пн:

02/01/09 вт.

03/01/09 ср:

и т.д.

Как бы я поступил так? Я нашел, как форматировать даты, но не могу найти, как циклически повторять определенный диапазон дат (в этом случае, чтобы циклически обходить целый месяц и печатать дату для каждого дня месяца).

У кого-нибудь есть какие-нибудь указатели, которые они могли бы дать мне о том, как начать?

Ответы [ 3 ]

8 голосов
/ 15 апреля 2009

Требуются следующие функции: 'encode-time, 'format-time-string и 'decode-time. Чтобы получить надлежащую документацию, либо C-h f function-name, либо предоставьте документацию по этой функции, либо общие страницы информации об elisp можно найти здесь: C-h i m elisp RET m time conversion RET

Вот этот фрагмент:

(defun my-insert-dates ()
  "insert a bunch of dates"
  (interactive)
  (let* ((month 3)
         (day 1)
         (time (encode-time 1 1 0 day month 2009)))
    (while (= (nth 4 (decode-time time)) month)
      (insert (format-time-string "%D %a:\n" time))
      (setq day (1+ day))
      (setq time (encode-time 1 1 0 day month 2009)))))

Я не мог найти, как определить количество дней в данном месяце (конечно, вы могли бы жестко запрограммировать его, но тогда вам придется иметь дело с високосными годами). К счастью, 'encode-time делает все сложение за вас, поэтому если вы передадите ему эквивалент «31 февраля», он вернет «3 марта» (при условии 28 дней).

4 голосов
/ 16 апреля 2009

Я бы сделал что-то подобное, если вы не возражаете против использования функции календаря ...

(require 'calendar)
(defun display-a-month (day month year)
  (insert (format "%s\n" (calendar-date-string (list  month day year))))
  (if (< day 30)
    (display-a-month (+ day 1) month year)))

Вы можете найти помощь, используя описать-функцию (М-описать-функцию или C-hf, как сказано выше); M-x apropos предоставит вам список функций, связанных с чем-то, и даже лучшие люди на irc.freenode.org / #emacs ответят на все ваши вопросы.

Кстати, вопрос был «вставить целый месяц», а не «вставить первый день каждого месяца» :) зависит, если вы читаете дд / мм / гггг мм / дд / гггг

2 голосов
/ 15 апреля 2009

Небольшой разброс в ответе Трея с использованием dotimes:

(defun my-insert-dates ()
  "insert the first day of each month"
  (interactive)
  (dotimes (mo 12)
    (insert (format-time-string "%D %a:\n" (encode-time 1 1 0 1 (1+ mo) 2009)))))
...