emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Friedrich Delgado Friedrichs <friedel@nomaden.org>
To: emacs-orgmode@gnu.org
Subject: Re: Mairix & Mutt
Date: Sat, 27 Sep 2008 13:18:17 +0200	[thread overview]
Message-ID: <20080927111817.GA15675@taupan.ath.cx> (raw)
In-Reply-To: <20080921045854.GA24656@thinkpad.adamsinfoserv.com>


[-- Attachment #1.1.1: Type: text/plain, Size: 2607 bytes --]

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 <friedel@nomaden.org>
Laziness led to the invention of the most useful tools.

[-- Attachment #1.1.2: mutt2remember.pl --]
[-- Type: text/x-perl, Size: 2626 bytes --]

#!/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 #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

[-- Attachment #2: Type: text/plain, Size: 204 bytes --]

_______________________________________________
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

  parent reply	other threads:[~2008-09-27 11:16 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-21  4:58 Mairix & Mutt Russell Adams
2008-09-21  8:24 ` [AvataR]
2008-09-21 14:22   ` Russell Adams
2008-09-27 11:18 ` Friedrich Delgado Friedrichs [this message]
2008-09-27 12:16   ` Russell Adams
2008-09-27 13:02     ` Friedrich Delgado Friedrichs

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080927111817.GA15675@taupan.ath.cx \
    --to=friedel@nomaden.org \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).