diff --git a/.msmtprc b/.msmtprc new file mode 100644 index 00000000..992f7b04 --- /dev/null +++ b/.msmtprc @@ -0,0 +1,11 @@ +account runlevel6 +host smtp.gmail.com +port 587 +protocol smtp +auth on +from gianni@runlevel6.org +user gianni@runlevel6.org +tls on +tls_trust_file ~/.mutt/Equifax_Secure_CA.cert + +account default : runlevel6 diff --git a/.mutt/Equifax_Secure_CA.cert b/.mutt/Equifax_Secure_CA.cert new file mode 100644 index 00000000..c3e11124 --- /dev/null +++ b/.mutt/Equifax_Secure_CA.cert @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/.mutt/alias b/.mutt/alias new file mode 100644 index 00000000..e69de29b diff --git a/.mutt/badwolf.muttrc b/.mutt/badwolf.muttrc new file mode 100644 index 00000000..9e7becbb --- /dev/null +++ b/.mutt/badwolf.muttrc @@ -0,0 +1,44 @@ +color normal color15 color233 +color error brightcolor15 color196 +color indicator color15 color235 +color status brightcolor39 color233 +color markers color142 color233 + +color hdrdefault color245 color233 +color header brightcolor214 color233 "^(Subject): " +color signature color243 color233 + +color body color137 color233 [\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+ +color body color137 color233 ((https?|ftp)://|www)+[\-\.\;@,/%~_:?&=\#a-zA-Z0-9+]+ +color bold brightcolor15 color233 +color search brightcolor16 color221 + +color quoted color243 color233 +color quoted1 color211 color233 +color quoted2 color222 color233 +color quoted3 color214 color233 +color quoted4 color154 color233 + +color tilde color240 color233 +color tree color240 color233 +color attachment brightcolor211 color233 + +# http://www.mutt.org/doc/manual/manual-4.html#ss4.2 +# color index color241 color233 ~A +# color index color241 color233 ~Q +# color index color243 color233 ~P +color index color221 color233 ~N +color index brightcolor211 color233 ~F +color index brightcolor39 color233 ~T +color index color243 color233 ~Q +color index color196 color233 ~D + +# Colorize inline diffs, really helpful for LKML or other mailing lists where +# mails frequently include patches. +color body brightcolor15 color233 '^diff .*' +color body brightcolor15 color233 '^[Ii]{1}ndex .*' +color body brightcolor15 color233 '^=+$' +color body brightcolor15 color233 '^(---|\+\+\+) .*' +color body brightcolor15 color233 '^@@ .*' +color body color121 color233 '^\+([^\+].*)?$' +color body color211 color233 '^-([^-].*)?$' diff --git a/.mutt/cache/bodies/.gitkeep b/.mutt/cache/bodies/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/.mutt/cache/headers/.gitkeep b/.mutt/cache/headers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/.mutt/mailcap b/.mutt/mailcap new file mode 100644 index 00000000..1800de37 --- /dev/null +++ b/.mutt/mailcap @@ -0,0 +1,35 @@ +# ~/.mutt/mailcap +# +# this uses the view_attachment script found in ~/.mutt/view_attachment.sh +# +# this is meant for an OS X system + +# MS Excel +# this will use the default xls spreadsheet handler from open +application/x-msexcel; ~/.mutt/view_attachment.sh %s +application/ms-exc; ~/.mutt/view_attachment.sh %s +application/excel; ~/.mutt/view_attachment.sh %s +application/msexcel; ~/.mutt/view_attachment.sh %s +application/vnd.ms-exc; ~/.mutt/view_attachment.sh %s +application/vnd.ms-excel; ~/.mutt/view_attachment.sh %s + +# MS Word +# use textedit to open .doc files as it's more light-weight +application/msword; ~/.mutt/view_attachment.sh %s "-" '/Applications/TextEdit.app' + +# Images +image/jpg; ~/.mutt/view_attachment.sh %s jpg +image/jpeg; ~/.mutt/view_attachment.sh %s jpg +image/pjpeg; ~/.mutt/view_attachment.sh %s jpg +image/png; ~/.mutt/view_attachment.sh %s png +image/gif; ~/.mutt/view_attachment.sh %s gif + +# PDF +# application/pdf; ~/.mutt/view_attachment.sh %s pdf + +# HTML +text/html; ~/.mutt/view_attachment.sh %s html + +# Unidentified. +application/octet-stream; ~/.mutt/view_attachment.sh %s "-" + diff --git a/.mutt/muttrc b/.mutt/muttrc new file mode 100644 index 00000000..099872f3 --- /dev/null +++ b/.mutt/muttrc @@ -0,0 +1,222 @@ +# Paths {{{ + +set alias_file = ~/.mutt/alias # where to store aliases +set header_cache = ~/.mutt/cache/headers # where to store headers +set message_cachedir = ~/.mutt/cache/bodies # where to store bodies +set certificate_file = ~/.mutt/certificates # where to store certs +set mailcap_path = ~/.mutt/mailcap # entries for filetypes +set tmpdir = ~/.mutt/temp # where to keep temp files +set signature = ~/.mutt/sig # my signature file + +# }}} +# Editor {{{ + +# Use Vim to compose email, with a few default options. +set editor = "/usr/local/bin/vim -c 'normal! }' -c 'redraw'" + +# }}} +# Contacts {{{ + +# Use the OS X address book +set query_command = "contacts -Sf '%eTOKEN%n' '%s' | sed -e 's/TOKEN/\t/g'" +bind editor complete-query +bind editor ^T complete + +# }}} +# Basic Options {{{ + +source ~/.mutt/badwolf.muttrc + +set wait_key = no # shut up, mutt +set mbox_type = Maildir # mailbox type +set folder = ~/.mail # mailbox location +set timeout = 3 # idle time before scanning +set mail_check = 0 # minimum time between scans +unset move # gmail does that +set delete # don't ask, just do +unset confirmappend # don't ask, just do! +set quit # don't ask, just do!! +unset mark_old # read/new is good enough for me +set beep_new # bell on new mails +set pipe_decode # strip headers and eval mimes when piping +set thorough_search # strip headers and eval mimes before searching + +# }}} +# Sidebar Patch {{{ + +set sidebar_delim = ' │' +set sidebar_visible = yes +set sidebar_width = 24 +color sidebar_new color221 color233 +bind index,pager sidebar-next +bind index,pager sidebar-prev +bind index,pager sidebar-open + +# }}} +# Status Bar {{{ + +set status_chars = " *%A" +set status_format = "───[ Folder: %f ]───[%r%m messages%?n? (%n new)?%?d? (%d to delete)?%?t? (%t tagged)? ]───%>─%?p?( %p postponed )?───" + +# }}} +# Index View Options {{{ + +set date_format = "%m/%d" +set index_format = "[%Z] %D %-20.20F %s" +set sort = threads # like gmail +set sort_aux = reverse-last-date-received # like gmail +set uncollapse_jump # don't collapse on an unread message +set sort_re # thread based on regex +set reply_regexp = "^(([Rr][Ee]?(\[[0-9]+\])?: *)?(\[[^]]+\] *)?)*" + +# }}} +# Pager View Options {{{ + +set pager_index_lines = 10 # number of index lines to show +set pager_context = 3 # number of context lines to show +set pager_stop # don't go to next message automatically +set menu_scroll # scroll in menus +set tilde # show tildes like in vim +unset markers # no ugly plus signs +set quote_regexp = "^( {0,4}[>|:#%]| {0,4}[a-z0-9]+[>|]+)+" +alternative_order text/plain text/enriched text/html + +# }}} +# Compose View Options {{{ + +set realname = "Gianni Chiappetta" # who am i? +set envelope_from # which from? +set sig_dashes # dashes before sig +set edit_headers # show headers when composing +set fast_reply # skip to compose when replying +set askcc # ask for CC: +set fcc_attach # save attachments with the body +unset mime_forward # forward attachments as part of body +set forward_format = "Fwd: %s" # format of subject when forwarding +set forward_decode # decode when forwarding +set attribution = "On %d, %n wrote:" # format of quoting header +set reply_to # reply to Reply to: field +set reverse_name # reply as whomever it was to +set include # include message in replies +set forward_quote # include message in forwards + +# }}} +# Headers {{{ + +ignore * # ignore all headers +unignore from: to: cc: date: subject: # show only these +unhdr_order * +hdr_order from: to: cc: date: subject: # and in this order + +# }}} +# steve@stevelosh.com {{{ + +# Default inbox. +set spoolfile = "+gianni-runlevel6.org/INBOX" + +# Alternate email addresses. +alternates gianni@metalabdesign.com + +# Mailboxes to show in the sidebar. +mailboxes +gianni-runlevel6.org/INBOX \ + +gianni-runlevel6.org/vim \ + +gianni-runlevel6.org/clojure \ + +gianni-runlevel6.org/python \ + +gianni-runlevel6.org/mercurial \ + +gianni-runlevel6.org/archive \ + +gianni-runlevel6.org/sent \ + +gianni-runlevel6.org/drafts \ + +temporary/search \ + +# Other special folders. +set mbox = "+gianni-runlevel6.org/archive" +set postponed = "+gianni-runlevel6.org/drafts" + +# Sending email. +set from = "gianni@runlevel6.org" +set sendmail = "/usr/local/bin/msmtp -a gianni" +set sendmail_wait = 0 # no please don't silently fail, email is important +unset record + +# }}} +# Account Hooks {{{ + +# folder-hook gianni-runlevel6.org/* source ~/.mutt/gianni-runlevel6.org.muttrc + +# }}} +# Key Bindings {{{ + +# Index {{{ + +bind index \# noop +bind index R group-reply +bind index sync-mailbox +bind index k previous-entry +bind index j next-entry +bind index gg first-entry +bind index G last-entry +bind index p recall-message +bind index collapse-thread +bind index N search-opposite +macro index s "cat > ~/Desktop/" "save message as" + +# Mark all as read +macro index \Cr "T~UN." "mark all messages as read" + +# Sync email +macro index O "offlineimap" "run offlineimap to sync all mail" +macro index o "offlineimap -qf INBOX" "run offlineimap to sync inbox" + +# Saner copy/move dialogs +macro index C "?" "copy a message to a mailbox" +macro index M "?" "move a message to a mailbox" + +# Quickly change mailboxes +macro index \' "+gianni-runlevel6.org/INBOX" "go to INBOX" +macro index \" "+gianni-runlevel6.org/archive" "go to archive" + +# Search with notmuch +macro index S "unset wait_keymutt-notmuch-py -G ~/.mail/temporary/search+temporary/search" "search mail (using notmuch)" + +# Unlimit (show [a]ll) +macro index a "all\n" "show all messages (undo limit)" + +# }}} +# Pager {{{ + +bind pager \# noop +bind pager k previous-line +bind pager j next-line +bind pager gg top +bind pager G bottom + +bind pager R group-reply +bind pager N search-opposite + +macro pager \Cu "|urlview" "call urlview to open links" +macro pager s "cat > ~/Desktop/" "save message as" + +# Quickly change mailboxes +macro pager \' "+gianni-runlevel6.org/INBOX" "go to INBOX" +macro pager \" "+gianni-runlevel6.org/archive" "go to archive" + +# }}} +# Compose {{{ + +bind compose p postpone-message + +# }}} +# Attachment {{{ + +# View, god dammit! +bind attach view-mailcap + +# }}} +# "Open in Vim" {{{ + +macro index,pager V "|vim -c 'setlocal ft=mail' -c 'setlocal buftype=nofile' -" "open in vim" +macro index,pager M "|mvim -c 'setlocal ft=mail' -c 'setlocal buftype=nofile' - >/dev/null" "open in macvim" + +# }}} + +# }}} diff --git a/.mutt/offlineimap.py b/.mutt/offlineimap.py new file mode 100644 index 00000000..cd018c19 --- /dev/null +++ b/.mutt/offlineimap.py @@ -0,0 +1,16 @@ +#!/usr/bin/python +import re, subprocess +def get_keychain_pass(account=None, server=None): + params = { + 'security': '/usr/bin/security', + 'command': 'find-internet-password', + 'account': account, + 'server': server, + 'keychain': '/Users/`whoami`/Library/Keychains/login.keychain', + } + command = "sudo -u `whoami` %(security)s -v %(command)s -g -a %(account)s -s %(server)s %(keychain)s" % params + output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT) + outtext = [l for l in output.splitlines() + if l.startswith('password: ')][0] + + return re.match(r'password: "(.*)"', outtext).group(1) diff --git a/.mutt/offlineimapsync.sh b/.mutt/offlineimapsync.sh new file mode 100755 index 00000000..8332ec2f --- /dev/null +++ b/.mutt/offlineimapsync.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +PID=`cat ~/.offlineimap/pid` +ps aux | grep "[ ]$PID" && kill $PID + +function sync_normal { + echo "NORMAL Sync" + /usr/local/share/python/offlineimap -o -u quiet +} +function sync_quick { + echo "QUICK Sync" + /usr/local/share/python/offlineimap -o -q -u quiet +} + +# This is silly. +python -c'import sys, random; sys.exit(random.randint(0, 5))' && sync_normal || sync_quick + +exit 0 diff --git a/.mutt/sig b/.mutt/sig new file mode 100644 index 00000000..a3e1eef7 --- /dev/null +++ b/.mutt/sig @@ -0,0 +1,3 @@ +Gianni Chiappetta +Runlevel6 +gf3.ca diff --git a/.mutt/temp/.gitkeep b/.mutt/temp/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/.mutt/view_attachment.sh b/.mutt/view_attachment.sh new file mode 100755 index 00000000..df8b9a17 --- /dev/null +++ b/.mutt/view_attachment.sh @@ -0,0 +1,127 @@ +#!/bin/bash +# +# Author: Eric Gebhart +# +# Purpose: To be called by mutt as indicated by .mailcap to handle mail attachments. +# +# Function: Copy the given file to a temporary directory so mutt +# Won't delete it before it is read by the application. +# +# Along the way, discern the file type or use the type +# That is given. +# +# Finally use 'open' or 'open -a' if the third argument is +# given. +# +# +# Arguments: +# +# $1 is the file +# $2 is the type - for those times when file magic isn't enough. +# I frequently get html mail that has no extension +# and file can't figure out what it is. +# +# Set to '-' if you don't want the type to be discerned. +# Many applications can sniff out the type on their own. +# And they do a better job of it too. +# +# Open Office and MS Office for example. +# +# $3 is open with. as in open -a 'open with this .app' foo.xls +# +# Examples: These are typical .mailcap entries which use this program. +# +# Image/JPEG; /Users/vdanen/.mutt/view_attachment %s +# Image/PNG; /Users/vdanen/.mutt/view_attachment %s +# Image/GIF; /Users/vdanen/.mutt/view_attachment %s +# +# Application/PDF; /Users/vdanen/.mutt/view_attachment %s +# +# #This HTML example passes the type because file doesn't always work and +# #there aren't always extensions. +# +# text/html; /Users/vdanen/.mutt/view_attachment %s html +# +# # If your Start OpenOffice.org.app is spelled with a space like this one, <-- +# # then you'll need to precede the space with a \ . I found that too painful +# # and renamed it with an _. +# +# Application/vnd.ms-excel; /Users/vdanen/.mutt/view_attachment %s "-" '/Applications/OpenOffice.org1.1.2/Start_OpenOffice.org.app' +# Application/msword; /Users/vdanen/.mutt/view_attachment %s "-" '/Applications/OpenOffice.org1.1.2/Start_OpenOffice.org.app' +# +# +# Debugging: If you have problems set debug to 'yes'. That will cause a debug file +# be written to /tmp/mutt_attach/debug so you can see what is going on. +# +# See Also: The man pages for open, file, basename +# + +# the tmp directory to use. +tmpdir="$HOME/.tmp/mutt_attach" + +# the name of the debug file if debugging is turned on. +debug_file=$tmpdir/debug + +# debug. yes or no. +#debug="no" +debug="yes" + +type=$2 +open_with=$3 + +# make sure the tmpdir exists. +mkdir -p $tmpdir + +# clean it out. Remove this if you want the directory +# to accumulate attachment files. +rm -f $tmpdir/* + +# Mutt puts everything in /tmp by default. +# This gets the basic filename from the full pathname. +filename=`basename $1` + +# get rid of the extenson and save the name for later. +file=`echo $filename | cut -d"." -f1` + +if [ $debug = "yes" ]; then + echo "1:" $1 " 2:" $2 " 3:" $3 > $debug_file + echo "Filename:"$filename >> $debug_file + echo "File:"$file >> $debug_file + echo "===========================" >> $debug_file +fi + +# if the type is empty then try to figure it out. +if [ -z $type ]; then + file $1 + type=`file -bi $1 | cut -d"/" -f2` +fi + +# if the type is '-' then we don't want to mess with type. +# Otherwise we are rebuilding the name. Either from the +# type that was passed in or from the type we discerned. +if [ $type = "-" ]; then + newfile=$filename +else + newfile=$file.$type +fi + +newfile=$tmpdir/$newfile + +# Copy the file to our new spot so mutt can't delete it +# before the app has a chance to view it. +cp $1 $newfile + +if [ $debug = "yes" ]; then + echo "File:" $file "TYPE:" $type >> $debug_file + echo "Newfile:" $newfile >> $debug_file + echo "Open With:" $open_with >> $debug_file +fi + +# If there's no 'open with' then we can let preview do it's thing. +# Otherwise we've been told what to use. So do an open -a. + +if [ -z $open_with ]; then + open $newfile +else + open -a "$open_with" $newfile +fi diff --git a/.notmuch-config b/.notmuch-config new file mode 100644 index 00000000..9a245496 --- /dev/null +++ b/.notmuch-config @@ -0,0 +1,86 @@ +# .notmuch-config - Configuration file for the notmuch mail system +# +# For more information about notmuch, see http://notmuchmail.org + +# Database configuration +# +# The only value supported here is 'path' which should be the top-level +# directory where your mail currently exists and to where mail will be +# delivered in the future. Files should be individual email messages. +# Notmuch will store its database within a sub-directory of the path +# configured here named ".notmuch". +# +[database] +path=/Users/gianni/.mail/gianni-runlevel6.org + +# User configuration +# +# Here is where you can let notmuch know how you would like to be +# addressed. Valid settings are +# +# name Your full name. +# primary_email Your primary email address. +# other_email A list (separated by ';') of other email addresses +# at which you receive email. +# +# Notmuch will use the various email addresses configured here when +# formatting replies. It will avoid including your own addresses in the +# recipient list of replies, and will set the From address based on the +# address to which the original email was addressed. +# +[user] +name=Gianni Chiappetta +primary_email=gianni@runlevel6.org + +# Configuration for "notmuch new" +# +# The following options are supported here: +# +# tags A list (separated by ';') of the tags that will be +# added to all messages incorporated by "notmuch new". +# +# ignore A list (separated by ';') of file and directory names +# that will not be searched for messages by "notmuch new". +# +# NOTE: *Every* file/directory that goes by one of those names will +# be ignored, independent of its depth/location in the mail store. +# +[new] +tags=unread;inbox; +ignore= + +# Search configuration +# +# The following option is supported here: +# +# exclude_tags +# A ;-separated list of tags that will be excluded from +# search results by default. Using an excluded tag in a +# query will override that exclusion. +# +[search] +exclude_tags=deleted;spam; + +# Maildir compatibility configuration +# +# The following option is supported here: +# +# synchronize_flags Valid values are true and false. +# +# If true, then the following maildir flags (in message filenames) +# will be synchronized with the corresponding notmuch tags: +# +# Flag Tag +# ---- ------- +# D draft +# F flagged +# P passed +# R replied +# S unread (added when 'S' flag is not present) +# +# The "notmuch new" command will notice flag changes in filenames +# and update tags, while the "notmuch tag" and "notmuch restore" +# commands will notice tag changes and update flags in filenames +# +[maildir] +synchronize_flags=true diff --git a/.offlineimaprc b/.offlineimaprc new file mode 100644 index 00000000..26d71452 --- /dev/null +++ b/.offlineimaprc @@ -0,0 +1,40 @@ +[general] +ui = TTY.TTYUI +accounts = Runlevel6 +pythonfile=~/.mutt/offlineimap.py +fsync = False + +[Account Runlevel6] +localrepository = Runlevel6-Local +remoterepository = Runlevel6-Remote +status_backend = sqlite +postsynchook = notmuch new + +[Repository Runlevel6-Local] +type = Maildir +localfolders = ~/.mail/gianni-runlevel6.org +nametrans = lambda folder: {'drafts': '[Gmail]/Drafts', + 'sent': '[Gmail]/Sent Mail', + 'flagged': '[Gmail]/Starred', + 'trash': '[Gmail]/Trash', + 'archive': '[Gmail]/All Mail', + }.get(folder, folder) + +[Repository Runlevel6-Remote] +cert_fingerprint=6d1b5b5ee0180ab493b71d3b94534b5ab937d042 +maxconnections = 1 +type = Gmail +remoteuser = gianni@runlevel6.org +remotepasseval = get_keychain_pass(account="gianni@runlevel6.org", server="imap.gmail.com") +realdelete = no +nametrans = lambda folder: {'[Gmail]/Drafts': 'drafts', + '[Gmail]/Sent Mail': 'sent', + '[Gmail]/Starred': 'flagged', + '[Gmail]/Trash': 'trash', + '[Gmail]/All Mail': 'archive', + }.get(folder, folder) +folderfilter = lambda folder: folder not in ['[Gmail]/Trash', + '[Gmail]/Important', + '[Gmail]/Spam', + ] + diff --git a/.urlview b/.urlview new file mode 100644 index 00000000..2445afd0 --- /dev/null +++ b/.urlview @@ -0,0 +1 @@ +COMMAND open %s