2009-04-15 11 views
6

Sto facendo un po 'di programmazione qua e là in Emacs Lisp, ma non sono del tutto sicuro su come andare su certe cose.Inserire intero mese di date in Emacs Lisp

Sto cercando di inserire un intero mese di date, ciascuna su una nuova linea come la lista qui sotto:

gennaio

01/01/09 Mon:

01/02/09 mar:

03/01/09 mer:

ecc

Come wou Devo fare questo? Ho trovato come formattare le date, ma non riesco a trovare come eseguire il ciclo su un certo intervallo di date (in questo caso per eseguire il ciclo di un intero mese e stampare una data per ogni giorno del mese).

Qualcuno ha qualche suggerimento che potrebbe darmi su come iniziare?

risposta

6

Le funzioni desiderate sono 'encode-time, 'format-time-string e 'decode-time. Per la documentazione adeguata, sia C-h f function-name o vi darà la documentazione per la funzione, o le pagine Informazioni Generali elisp può essere trovato qui: C-h i m elisp RET m time conversion RET

Ecco che frammento:

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

non riuscivo a trovare come determinare il numero di giorni in un dato mese (certo, potresti hardcodificarlo, ma poi devi gestire gli anni bisestili). Fortunatamente, lo 'encode-time fa tutto per te, quindi se passi l'equivalente di "31 febbraio", ritornerà "3 marzo" (supponendo 28 giorni).

1

leggera variante di Trey risposta utilizzando 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

Proprio commentando che ho aggiornato il mio rispondi a scorrere i giorni (non i mesi). Nel caso in cui la gente si fosse confusa su come hai ricavato la tua risposta dalla mia. –

+0

Ack, ora la mia risposta non ha senso :) Oh beh, dotimes è ancora buono sapere per il conteggio dei cicli. – scottfrazer

+0

Sì, mi dimentico dei dotimes. –

3

avrei fatto una cosa del genere, se non ti dispiace utilizzando la funzione di calendario ...

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

Si può trovare aiutare a usare la funzione descrittiva (funzione descrittiva Mx o Ch f come detto prima); M-x apropos ti fornirà un elenco di funzioni relative a qualcosa e anche persone migliori su irc.freenode.org/#emacs risponderanno a tutte le tue domande.

btw, la domanda era "inserire un mese intero" non "inserire primo giorno di ogni mese" :) dipende se leggete gg/mm/aaaa di gg/mm/aaaa

+0

Per curiosità, perché il '(let (_) ...' wrapper? –

+0

Solo perché ha dimenticato che elisp è stato in grado di fare il lavoro non funzionale. – Ben