2009-04-15 5 views
6

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

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

января

01/01/09 пн:

02/01/09 Вт:

03/01/09 ср:

и т.д.

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

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

ответ

6

Функции, которые вы хотите, это '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 дней).

1

Незначительные вариации на ответ, используя 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))))) 
+0

Просто комментирование, что я обновил свой ответьте на цикл через дни (а не месяцы). На всякий случай люди смутились относительно того, как вы получили свой ответ от моего. –

+0

Ack, теперь мой ответ не имеет смысла :) О, хорошо, дотимы по-прежнему хороши для подсчета циклов. – scottfrazer

+0

Yup, я забыл о дотимах. –

3

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

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

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

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

+0

Из любопытства, почему '(let (_) ...' wrapper? –

+0

Просто потому, что забыл, что elisp смог выполнить нефункциональную работу. – Ben