6.2 KiB
mu-guile: guile-bindings for mu
Starting from version 0.9.7, mu had 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 – 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))
License & Copyright
mu-guile was designed and implemented by Dirk-Jan C. Binnema, and is Free Software, licensed under the GNU GPLv3
#+html:<hr/><div align="center">© 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>