Hi!

I was thinking about how to interface mutt and org-mode for quite some
time now but didn't really get around to it.

I've tried to use many emacs MUAs for this purpose (mh-e, wanderlust,
mew and finally the great scary GNUs) but they're not quite to my
taste.

Your proposal gave me the necessary hacktivation energy to come up
with my version of this prototype. I also borrowed some of your code,
but backported it to perl 5.8.

Russell Adams schrieb:
> The workflow goes like this:
>
>  - Reading email in Mutt, in index or pager
>  - Trigger script via M-o in Mutt
>  - Middle-click into my org-mode buffer pasting the link
>  - Later visit the link and execute mairix to find message by ID
>  - In current Mutt session, use M-` to jump to search folder and read
>    message
---Zitatende---

Those are a few steps too many for me. I wanted to press <f9>t in the
index or pager and then pop up an emacs window with remember.

As org-annotation-helper.el does this already, I decided to use it.

Also mutt is able to search its own mailboxes, not as flexible as
mairix, because it can only search a single folder, but I only really
want to link back to a certain mail for now.

I also had a long conversation with pdmef on channel #mutt on
freenode.net, who gave me the two crucial ideas how to configure this
in mutt.

The main idea is to use the path-type variable record to get the name
of the current folder and store it in the two keyboard macros. The
keyboard macros change every time you change a folder in mutt.

This is a rough prototype still. I'd like to get rid of the (y/n)
prompt and therefore I'd like to have a link-type "mutt:" in org,
which means some of the functionality of the perl-script would have to
get implemented in emacs-lisp. But that would give me the benefit of a
customisable terminal and maybe get everything a bit less hairy...

You'll notice that calling mutt with a mail is not very straight
forward. In theory,

mutt -f $mailbox -e "push <search>~i$msgid<enter><display-message>"

should be sufficient. However if it's started via xterm -e, the
keystrokes don't arrive, maybe because xterm does some terminal
initialisations after mutt has started (or my window manager sends a
resize signal a bit too late, something like that). That's why I'm
writing the keystrokes to a temporary file. Not elegant, but does the
job.

Maybe we get the next guy inspired to hack on this now :)

-- 
        Friedrich Delgado Friedrichs <[EMAIL PROTECTED]>
Laziness led to the invention of the most useful tools.
#!/usr/bin/perl

# $Id: mutt2remember.pl,v 1.4 2008/09/27 11:15:04 friedel Exp $

# Variations on a theme given by Russell Adams http://lists.gnu.org/archive/html/emacs-orgmode/2008-09/msg00300.html

my $terminal="xterm -e";

# Install:
# ========

# 1.) put the following in your muttrc:

my $muttrc_snippet = <<END;
folder-hook . " \
set my_record=\$record; \
set my_pipe_decode=\$pipe_decode; \
set my_wait_key=\$wait_key; \
set record=^; \
macro index,pager <f9>t \"<enter-command>set pipe_decode=no;set wait_key=no<enter><pipe-message>mutt2remember.pl remember \$record<enter><enter-command>set wait_key=\$my_wait_key ;set pipe_decode=\$my_pipe_decode<enter>\" \"remember mail in emacs\"; \
macro index,pager <f9>n \"<enter-command>set pipe_decode=no;set wait_key=no<enter><pipe-message>mutt2remember.pl annotation \$record<enter><enter-command>set wait_key=\$my_wait_key ;set pipe_decode=\$my_pipe_decode<enter>\" \"copy url to mail in emacs\"; \
set record=\$my_record;"
END

# 2) put this file into your $HOME/bin and make it executable.

# 3) make sure org-annotation-helper.el is loaded in your org config

# 4) optionally: set $terminal above to something you prefer.

# 5) press <f9>n in the pager or index to annotate a mail url,
#    press <f9>t to *remember* it

# 6) follow the generated link in emacs to open the mail in mutt.

use strict;
use warnings;

use URI::Escape qw/ uri_escape /;
use File::Temp qw/ mkstemp /;


my $action=$ARGV[0];
my $folder=$ARGV[1];

if ($action eq "remember" or $action eq "annotation") {

  my ( $Subject , $From , $MID );

  while (<STDIN>) {

    chomp;

    if (/^Subject: /) {
      ( $Subject ) = $_ =~ m/^Subject: (.*)$/;
    }

    if (/^From: /) {
      ( $From ) = $_ =~ m/^From: (.*)$/;
    }

    if (/^Message-ID:\s*/) {
      ( $MID ) = $_ =~ m/^Message-ID:\s*<(.*)>\s*$/;
    }

    if (/^$/) {
      last; # Header ends on first blank line
    }
  }


  $From = uri_escape($From);
  $Subject = uri_escape($Subject);

  $folder =~ tr/=/+/;

  my $uri = "shell:"
    . $terminal
      . " mutt2remember.pl open "
        . $folder
          . " "
            . $MID;

  $uri = uri_escape($uri);

  my $Link = $action . ":" . $uri . "::remember::Mail From $From: $Subject";

  system ("emacsclient", "--eval", "(progn (bzg/org-annotation-helper \"$Link\") nil)");
} elsif ($action eq "open") {
  my $msgid=$ARGV[2];
  my ($tmp, $tmpfile) = mkstemp(($ENV{TMP} or "/tmp") . "/mutt2rememberXXXXXXXX");

  printf $tmp "push \"<search>~i$msgid<enter><display-message>\"";
  system("mutt", "-f", $folder, "-e", "source $tmpfile");

  close $tmp;

  unlink $tmpfile;

}


Attachment: signature.asc
Description: Digital signature

_______________________________________________
Emacs-orgmode mailing list
Remember: use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

Reply via email to