mu/www/mu-guile.org

5.3 KiB
Raw Blame History

mu-guile: guile-bindings for mu

Starting from version 0.9.7, mu had early, experimental bindings for the GNU/Guile programming language, which is a version of the Scheme programming language, specifically designed for extending existing programs.

mu version 0.9.8 has much improved bindings, and they are documented, with many examples. You can find more examples in the guile/examples directory of the mu source package.

It must be said that Scheme (and in general, languages from the Lisp-family) initially may look a bit 'strange' all these parentheses etc.; so please bear with us.

Some examples

Here are some examples; we don't provide too much explanation how they do what they do, but the manual takes you through that, step-by-step.

Messages per weekday

#!/bin/sh
exec guile -s $0 $@
!#

(use-modules (mu) (mu message) (mu stats) (mu plot))
(mu:initialize)

;; create a list like (("Mon" . 13) ("Tue" . 23) ...)
(define weekday-table
  (mu:day-numbers->names
    (sort
      (mu:tabulate-messages
	(lambda (msg)
	  (tm:wday (localtime (mu:date msg)))))
      (lambda (a b) (< (car a) (car b))))))

(for-each
  (lambda (elm)
    (format #t "~a: ~a\n" (car elm) (cdr elm)))
  weekday-table)

Which might get us something like:

Sun: 2278
Mon: 2991
Tue: 3077
Wed: 2734
Thu: 2796
Fri: 2343
Sat: 1856

Drawing graphs

We can also draw graphs from this, by adding the following to the script:

;; plain-text graph
(mu:plot (weekday-table) "Messages per weekday" "Day" "Messages" #t)

;; GUI graph
(mu:plot (weekday-table) "Messages per weekday" "Day" "Messages")

This gives us the following:

plain text graph
                               Messages per weekday
 Messages
   3200 ++---+--------+---------+--------+---------+---------+--------+---++
        |    +        +     "/tmp/filel8NGRf" using 2:xticlabels(1) ****** |
   3000 ++                  *       *                                     ++
        |         ***********       *                                      |
        |         *        **       *                                      |
   2800 ++        *        **       *          *********                  ++
        |         *        **       ************       *                   |
   2600 ++        *        **       **        **       *                  ++
        |         *        **       **        **       *                   |
        |         *        **       **        **       *                   |
   2400 ++        *        **       **        **       ***********        ++
        ***********        **       **        **       **        *         |
   2200 *+       **        **       **        **       **        *        ++
        *        **        **       **        **       **        *         |
        *        **        **       **        **       **        *         |
   2000 *+       **        **       **        **       **        *        ++
        *    +   **   +    **   +   **   +    **   +   **    +   ***********
   1800 ********************************************************************
            Sun      Mon       Tue      Wed       Thu       Fri      Sat
                                        Day
GUI graph

/emacs/mu/media/commit/6ba2b8c5887a73b0b2caac7364142dc396094678/www/graph01.png

Export contacts to mutt

mu provides mu cfind to get contact information from the database; it's fast, since it uses cached contact data. But sometimes, we may want to get a bit more advanced. For examples, suppose I want a list of names and e-mail addresses of people that were seen at least 20 times since 2010, in the mutt address book format.

We could get such a list with something like the following:

#!/bin/sh
exec guile -s $0 $@ !#

(use-modules (mu) (mu message) (mu contact))
(mu:initialize)

;; Get a list of contacts that were seen at least 20 times since 2010
(define (selected-contacts)
  (let  ((addrs '())
	  (start (car (mktime (car (strptime "%F" "2010-01-01")))))
	  (minfreq 20))
    (mu:for-each-contact
      (lambda (contact)
	(if (and (mu:email contact)
	      (>= (mu:frequency contact) minfreq)
	      (>= (mu:last-seen contact) start))
	  (set! addrs (cons contact addrs)))))
      addrs))

(for-each
  (lambda (contact)
    (format #t "~a\n" (mu:contact->string contact "mutt-alias")))
  (selected-contacts))

License & Copyright

mu4e was designed and implemented by Dirk-Jan C. Binnema, and is Free Software, licensed under the GNU GPLv3

#+html:<hr/><div align="center">&copy; 2011-2012 Dirk-Jan C. Binnema</div>

<script type="text/javascript"> var gaJsHost = (("https:" = document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src'" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); </script> <script type="text/javascript"> var pageTracker = _gat._getTracker("UA-578531-1"); pageTracker._trackPageview(); </script>