2009-04-15 11 views
6

Estoy haciendo un poco de programación aquí y allá en Emacs Lisp, pero no estoy muy seguro de cómo hacer ciertas cosas.Insertar mes completo de fechas en Emacs Lisp

Estoy tratando de insertar un mes entero de fechas, cada uno en una nueva línea como la siguiente lista:

enero

01/01/09 Mon:

02/01/09 mar:

03/01/09 Mier:

etc

¿Cómo que está ¿Debo hacer eso? He descubierto cómo dar formato a las fechas, pero no puedo encontrar cómo recorrer un cierto rango de fechas (en este caso para recorrer todo un mes e imprimir una fecha para cada día del mes).

¿Alguien ha recibido algunos consejos que me podrían dar sobre cómo empezar?

Respuesta

6

Las funciones que desea son 'encode-time, 'format-time-string y 'decode-time. Para la documentación apropiada, ya sea C-h f function-name o le dará la documentación de la función, o las páginas Información General elisp se puede encontrar aquí: C-h i m elisp RET m time conversion RET

Aquí es eso fragmento:

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

no pude encontrar cómo determinar el número de días en un mes determinado (seguro, podrías codificarlo, pero luego tienes que lidiar con años bisiestos). Afortunadamente, 'encode-time hace todo el agregado por usted, de modo que si lo pasa el equivalente a "31 de febrero", devolverá "3 de marzo" (suponiendo 28 días).

1

variación leve en respuesta utilizando dotimes de Trey:

(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

Sólo comentar que he actualizado mi respuesta para recorrer los días (no meses). Solo en caso de que la gente se confundiera en cuanto a cómo obtuviste tu respuesta de la mía. –

+0

Ack, ahora mi respuesta no tiene sentido :) Bueno, todavía es bueno saber de puntos para contar los bucles. – scottfrazer

+0

Sí, me olvido de los puntos débiles. –

3

yo hubiera hecho algo como esto, si no les importa usar la función de agenda ...

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

Usted puede encontrar ayuda a usar describir-función (Mx describe-function o Ch f como se dijo antes); M-x apropos le dará una lista de funciones relacionadas con algo e incluso mejores personas en irc.freenode.org/#emacs responderán todas sus preguntas.

por cierto, la pregunta era "insertar un mes entero" no "insertar primer día de cada mes" :) depende si lee dd/mm/aaaa del dd/mm/aaaa

+0

Por curiosidad, ¿por qué el contenedor '(let (_) ...'? –

+0

Solo porque se olvidó de que elisp fue capaz de hacer un trabajo no funcional. – Ben