mu-guile

Starting from version 0.9.7, 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 – you will get used to it.

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.

NOTE (1): if you get errors like ERROR: no code for module (mu), guile cannot find the mu modules. To solve this, you need to set the GUILE_LOAD_PATH to the directory with the installed mu.scm, e.g.

   export GUILE_LOAD_PATH="/usr/local/share/guile/site/2.0"

(you need to adapt this if you installed mu in some non-standard place; but it’s always the directory with the installed mu.scm).

NOTE (2): for the graphs (below) to work, you will need to have the gnuplot program installed.

NOTE (3): the examples below assume that you have your messages indexed already using mu; see the man pages, or the mu cheat sheet.

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:weekday-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 outputs something like:

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

The numbers may be a bit different though… In my case, Saturday seems a particularly slow day for e-mail.

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

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

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