2008-03-21 12:10:23 -04:00
;;; org-mac-message.el --- Support for links to Apple Mail messages from within Org-mode
2008-03-14 06:41:54 -04:00
2009-01-06 04:47:36 -05:00
;; Copyright (C) 2008, 2009 Free Software Foundation, Inc.
2008-03-14 06:41:54 -04:00
;; Author: John Wiegley <johnw@gnu.org>
2009-03-22 11:02:54 -04:00
;; Christopher Suckling <suckling at gmail dot com>
2009-03-14 03:03:10 -04:00
;; Version: 6.24trans
2008-02-04 10:44:17 -05:00
;; Keywords: outlines, hypermedia, calendar, wp
2008-03-14 06:41:54 -04:00
2008-02-05 09:38:57 -05:00
;; This file is part of GNU Emacs.
2008-03-14 06:41:54 -04:00
2008-05-06 08:45:52 -04:00
;; GNU Emacs is free software: you can redistribute it and/or modify
2008-02-04 10:44:17 -05:00
;; it under the terms of the GNU General Public License as published by
2008-05-06 08:45:52 -04:00
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
2008-02-04 10:44:17 -05:00
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
2008-05-06 08:45:52 -04:00
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
2008-03-14 06:41:54 -04:00
2008-03-21 12:10:23 -04:00
;;; Commentary:
;; This file implements links to Apple Mail messages from within Org-mode.
;; Org-mode does not load this module by default - if you would actually like
;; this to happen then configure the variable `org-modules'.
2009-03-22 11:02:54 -04:00
;; If you would like to create links to all flagged messages in an
;; Apple Mail account, please customize the variable
;; org-mac-mail-account and then call one of the following functions:
;; (org-mac-create-flagged-mail) copies a formatted list of links to
;; the kill ring.
;; (org-mac-insert-flagged-mail) searches within an org-mode buffer
;; for a specific heading, creating it if it doesn't exist. Any
;; message:// links within the first level of the heading are deleted
;; and replaced with links to flagged messages.
;; If you have Growl installed and would like more visual feedback
;; whilst AppleScript searches for messages, please uncomment lines
;; 125 to 130.
2008-03-14 06:41:54 -04:00
;;; Code:
2008-02-04 10:44:17 -05:00
( require 'org )
2009-03-22 11:02:54 -04:00
( defgroup org-mac-flagged-mail nil
" Options concerning linking to flagged Mail.app messages "
:tag " Org Mail.app "
:group 'org-link )
( defcustom org-mac-mail-account " customize "
" The Mail.app account in which to search for flagged messages "
:group 'org-mac-flagged-mail
:type 'string )
2008-02-04 10:44:17 -05:00
( org-add-link-type " message " 'org-mac-message-open )
2008-09-10 05:10:21 -04:00
;; In mac.c, removed in Emacs 23.
( declare-function do-applescript " org-mac-message " ( script ) )
2008-02-04 10:44:17 -05:00
( unless ( fboundp 'do-applescript )
;; Need to fake this using shell-command-to-string
( defun do-applescript ( script )
2008-02-05 09:38:57 -05:00
( let ( start cmd return )
2008-02-04 10:44:17 -05:00
( while ( string-match " \n " script )
( setq script ( replace-match " \r " t t script ) ) )
( while ( string-match " ' " script start )
2008-02-05 09:38:57 -05:00
( setq start ( + 2 ( match-beginning 0 ) )
2008-02-04 10:44:17 -05:00
script ( replace-match " \\ ' " t t script ) ) )
( setq cmd ( concat " osascript -e ' " script " ' " ) )
( setq return ( shell-command-to-string cmd ) )
( concat " \" " ( org-trim return ) " \" " ) ) ) )
( defun org-mac-message-open ( message-id )
2008-03-21 12:10:23 -04:00
" Visit the message with the given MESSAGE-ID.
This will use the command ` open ' with the message URL. "
2008-02-04 10:44:17 -05:00
( start-process ( concat " open message: " message-id ) nil
2008-02-05 01:09:43 -05:00
" open " ( concat " message://< " ( substring message-id 2 ) " > " ) ) )
2008-02-04 10:44:17 -05:00
2008-02-05 01:09:43 -05:00
( defun org-mac-message-insert-link ( )
2008-02-05 09:38:57 -05:00
" Insert a link to the messages currently selected in Apple Mail.
This will use applescript to get the message-id and the subject of the
active mail in AppleMail and make a link out of it. "
2008-02-04 10:44:17 -05:00
( interactive )
2008-02-18 09:21:26 -05:00
( insert ( org-mac-message-get-link ) ) )
( defun org-mac-message-get-link ( )
" Insert a link to the messages currently selected in Apple Mail.
This will use applescript to get the message-id and the subject of the
active mail in AppleMail and make a link out of it. "
2008-02-04 10:44:17 -05:00
( let ( ( subject ( do-applescript " tell application \" Mail \"
set theMessages to selection
subject of beginning of theMessages
end tell " ))
( message-id ( do-applescript " tell application \" Mail \"
set theMessages to selection
message id of beginning of theMessages
end tell " )))
2008-02-18 09:21:26 -05:00
( org-make-link-string
( concat " message:// "
( substring message-id 1 ( 1- ( length message-id ) ) ) )
( substring subject 1 ( 1- ( length subject ) ) ) ) ) )
2008-02-04 10:44:17 -05:00
2009-03-22 11:02:54 -04:00
( defun org-mac-create-flagged-mail ( )
" Create links to flagged messages in a Mail.app account and
copy them to the kill ring "
( interactive )
( message " AppleScript: searching mailboxes... " )
( let* ( ( as-link-list
( do-applescript
( concat
" tell application \" Mail \" \n "
" set theMailboxes to every mailbox of account \" " org-mac-mail-account " \" \n "
" set theLinkList to {} \n "
" repeat with aMailbox in theMailboxes \n "
" set theSelection to (every message in aMailbox whose flagged status = true) \n "
" repeat with theMessage in theSelection \n "
" set theID to message id of theMessage \n "
" set theSubject to subject of theMessage \n "
" set theLink to \" message:// \" & theID & \" ::split:: \" & theSubject & \" \n \" \n "
" copy theLink to end of theLinkList \n "
;; "tell application \"GrowlHelperApp\"\n"
;; "set the allNotificationsList to {\"FlaggedMail\"}\n"
;; "set the enabledNotificationsList to allNotificationsList\n"
;; "register as application \"FlaggedMail\" all notifications allNotificationsList default notifications enabledNotificationsList icon of application \"Mail\"\n"
;; "notify with name \"FlaggedMail\" title \"Importing flagged message\" description theSubject application name \"FlaggedMail\"\n"
;; "end tell\n"
" end repeat \n "
" end repeat \n "
" return theLinkList as string \n "
" end tell " ) ) )
( link-list ( split-string as-link-list " \n " ) )
split-link
URL
description
orglink
( orglink-list nil ) )
( while link-list
( progn
( setq split-link ( split-string ( pop link-list ) " ::split:: " ) )
( setq URL ( car split-link ) )
( setq description ( cadr split-link ) )
( if ( not ( string= URL " " ) )
( progn
( setq orglink ( org-make-link-string URL description ) )
( push orglink orglink-list ) ) ) ) )
( with-temp-buffer
( while orglink-list
( insert ( concat ( pop orglink-list ) ) " \n " ) )
( kill-region ( point-min ) ( point-max ) )
( message " Flagged messages copied to kill ring " ) ) ) )
( defun org-mac-insert-flagged-mail ( org-buffer org-heading )
" Asks for an org buffer and a heading within it. If heading
exists, delete all message:// links within heading 's first
level. If heading doesn 't exist, create it at point-max. Insert
list of message:// links to flagged mail after heading. "
( interactive " bBuffer in which to insert links: \n sHeading after which to insert links: " )
( save-excursion
( set-buffer org-buffer )
( goto-char ( point-min ) )
( let ( ( isearch-forward t )
( message-re " \\ [ \\ [ \\ (message: \\ )? \\ ([^]]+ \\ ) \\ ] \\ ( \\ [ \\ ([^]]+ \\ ) \\ ] \\ )? \\ ] " ) )
( if ( org-goto-local-search-headings org-heading nil t )
( if ( not ( eobp ) )
( progn
( save-excursion
( while ( re-search-forward message-re ( save-excursion ( outline-next-heading ) ) t )
( delete-region ( match-beginning 0 ) ( match-end 0 ) ) )
( org-mac-create-flagged-mail )
( yank ) )
( flush-lines " ^$ " ( point ) ( outline-next-heading ) ) )
( insert " \n " )
( org-mac-create-flagged-mail )
( yank ) )
( goto-char ( point-max ) )
( insert " \n " )
( org-insert-heading )
( insert ( concat org-heading " \n " ) )
( org-mac-create-flagged-mail )
( yank ) ) ) ) )
2008-02-04 10:44:17 -05:00
( provide 'org-mac-message )
2008-03-14 06:37:35 -04:00
;; arch-tag: 3806d0c1-abe1-4db6-9c31-f3ed7d4a9b32
2008-04-29 01:15:41 -04:00
2008-02-04 10:44:17 -05:00
;;; org-mac-message.el ends here