Browse Source

Switch to a new version of org-mew.el, for testing purposes.

The decision which version should be used will be made in a few days,
I am switching to the new version for now to get some test results.
Carsten Dominik 17 years ago
parent
commit
97e557b696
1 changed files with 106 additions and 51 deletions
  1. 106 51
      lisp/org-mew.el

+ 106 - 51
lisp/org-mew.el

@@ -1,72 +1,127 @@
-;;; org-mew.el --- Support for links to messages in Mew
-;;
-;; Copyright 2008 Bastien Guerry
-;;
-;; Emacs Lisp Archive Entry
-;; Filename: org-mew.el
-;; Version: 6.02pre-04
-;; Author: Bastien Guerry <bzg AT altern DOT org>
-;; Maintainer: Bastien Guerry <bzg AT altern DOT org>
-;; Keywords: org, mail, Mew
-;;
-;; This program is free software; you can redistribute it and/or modify
+;;; org-mew.el --- Support for links to Mew messages from within Org-mode
+
+;; Copyright (C) 2008 Free Software Foundation, Inc.
+
+;; Author: Tokuya Kameshima <kames at fa2 dot so-net dot ne dot jp>
+;; Keywords: outlines, hypermedia, calendar, wp
+;; Homepage: http://orgmode.org
+;; Version: TBD
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
-;;
-;; This program is distributed in the hope that it will be useful,
+
+;; 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
-;; along with this program; if not, write to the Free Software
-;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
 ;;; Commentary:
-;;
-;; Mew is an Emacs mailer written by Kazu Yamamoto:  http://www.mew.org
-;; 
-;; This Org add-on provides a way to link to Mew messages.
-;;
-;; PUT this file into your load-path and the following into your ~/.emacs:
-;;   (require 'org-mew)
-;;
-;;; Code:
 
-(eval-when-compile
-  (require 'cl))
+;; This file implements links to Mew messages from within Org-mode.
+;; Org-mode loads this module by default - if this is not what you want,
+;; configure the variable `org-modules'.
+
+;;; Code:
 
 (require 'org)
 
-(org-add-link-type "mew" 'org-mew-open)
+(defgroup org-mew nil
+ "Options concerning the Mew link."
+ :tag "Org Startup"
+ :group 'org-link)
 
-(add-hook 'org-store-link-functions 'org-mew-store-link)
+(defcustom org-mew-link-to-refile-destination t
+ "Create a link to the refile destination if the message is marked as refile."
+ :group 'org-mew
+ :type 'boolean)
 
-(defun org-mew-open (mew-link)
-  "Visit the message targetted at by MEW-LINK."
-  (when (string-match "\\(+.*\\)+\\+\\([0-9]+\\)" mew-link)
-    (let ((folder (match-string 1 mew-link))
-	  (msg-num (match-string 2 mew-link)))
-      (mew-summary-visit-folder folder)
-      (when (mew-summary-search-msg msg-num)
-	(if mew-summary-goto-line-then-display
-	    (mew-summary-display))))))
+;; Declare external functions and variables
+(declare-function mew-cache-hit "ext:mew-cache" (fld msg &optional must-hit))
+(declare-function mew-header-get-value "ext:mew-header"
+		  (field &optional as-list))
+(declare-function mew-init "ext:mew" ())
+(declare-function mew-refile-get "ext:mew-refile" (msg))
+(declare-function mew-summary-display "ext:mew-summary2" (&optional redisplay))
+(declare-function mew-summary-folder-name "ext:mew-syntax" (&optional ext))
+(declare-function mew-summary-get-mark "ext:mew-mark" ())
+(declare-function mew-summary-message-number2 "ext:mew-syntax" ())
+(declare-function mew-summary-pick-with-mewl "ext:mew-pick"
+		  (pattern folder src-msgs))
+(declare-function mew-summary-search-msg "ext:mew-const" (msg))
+(declare-function mew-summary-set-message-buffer "ext:mew-summary3" (fld msg))
+(declare-function mew-summary-visit-folder "ext:mew-summary4"
+		  (folder &optional goend no-ls))
+(declare-function mew-window-push "ext:mew" ())
+(defvar mew-init-p)
+(defvar mew-summary-goto-line-then-display)
 
-(defun org-mew-store-link ()
-  "Store a link to a Mew message."
-  (when (and (fboundp 'mew-summary-p) (mew-summary-p))
-    (let ((folder (mew-summary-folder-name))
-	  (number (mew-summary-message-number))
-	  (subject (mew-summary-get-subject)))
-      (org-store-link-props
-       :type "mew"
-       :link (concat "mew:" folder "+" number)
-       :description subject))))
+;; Install the link type
+(org-add-link-type "mew" 'org-mew-open)
+(add-hook 'org-store-link-functions 'org-mew-store-link)
 
-(provide 'org-mew)
+;; Implementation
+(defun org-mew-store-link ()
+ "Store a link to a MEW folder or message."
+ (when (memq major-mode '(mew-summary-mode mew-virtual-mode))
+   (let* ((msgnum (mew-summary-message-number2))
+	   (mark-info (mew-summary-get-mark))
+	   (folder-name
+	    (if (and org-mew-link-to-refile-destination
+		     (eq mark-info ?o))	; marked as refile
+		(nth 1 (mew-refile-get msgnum))
+	      (mew-summary-folder-name)))
+	   message-id from to subject desc link)
+     (save-window-excursion
+	(if (fboundp 'mew-summary-set-message-buffer)
+	    (mew-summary-set-message-buffer folder-name msgnum)
+	  (set-buffer (mew-cache-hit folder-name msgnum t)))
+	(setq message-id (mew-header-get-value "Message-Id:"))
+	(setq from (mew-header-get-value "From:"))
+	(setq to (mew-header-get-value "To:"))
+	(setq subject (mew-header-get-value "Subject:")))
+     (org-store-link-props :type "mew" :from from :to to
+			    :subject subject :message-id message-id)
+     (setq message-id (org-remove-angle-brackets message-id))
+     (setq desc (org-email-link-description))
+     (setq link (org-make-link "mew:" folder-name
+				"#" message-id))
+     (org-add-link-props :link link :description desc)
+     link)))
 
-;;;  User Options, Variables
+(defun org-mew-open (path)
+ "Follow the Mew message link specified by PATH."
+ (let (folder msgnum)
+   (cond ((string-match "\\`\\(+.*\\)+\\+\\([0-9]+\\)\\'" path) ; for Bastien's
+	   (setq folder (match-string 1 link))
+	   (setq msgnum (match-string 2 link)))
+	  ((string-match "\\`\\(\\(%#\\)?[^#]+\\)\\(#\\(.*\\)\\)?" path)
+	   (setq folder (match-string 1 path))
+	   (setq msgnum (match-string 4 path)))
+	  (t (error "Error in Mew link")))
+   (require 'mew)
+   (mew-window-push)
+   (unless mew-init-p (mew-init))
+   (mew-summary-visit-folder folder)
+   (when msgnum
+     (if (not (string-match "\\`[0-9]+\\'" msgnum))
+	  (let* ((pattern (concat "message-id=" msgnum))
+		 (msgs (mew-summary-pick-with-mewl pattern folder nil)))
+	    (setq msgnum (car msgs))))
+     (if (mew-summary-search-msg msgnum)
+	  (if mew-summary-goto-line-then-display
+	      (mew-summary-display))
+	(error "Message not found")))))
 
+(provide 'org-mew)
 
 ;;; org-mew.el ends here