From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Georg C. F. Greve" Subject: org-mairix.el, version 0.3 Date: Thu, 27 Sep 2007 12:58:41 +0200 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0031636983==" Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Iar5c-0001u8-8J for emacs-orgmode@gnu.org; Thu, 27 Sep 2007 06:59:28 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Iar5W-0001sr-J9 for emacs-orgmode@gnu.org; Thu, 27 Sep 2007 06:59:26 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Iar5W-0001sm-C9 for emacs-orgmode@gnu.org; Thu, 27 Sep 2007 06:59:22 -0400 Received: from gadolin.fsfeurope.org ([195.176.254.152]) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Iar5V-0008R1-9n for emacs-orgmode@gnu.org; Thu, 27 Sep 2007 06:59:21 -0400 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --===============0031636983== Content-Type: multipart/signed; boundary="20070927125841+0200-178102340-29671576-226914545"; micalg=pgp-sha1; protocol="application/pgp-signature" --20070927125841+0200-178102340-29671576-226914545 Content-Type: multipart/mixed; boundary="20070927125841+0200-231696978105920563-9512" --20070927125841+0200-231696978105920563-9512 Hi all, below is version 0.3 of org-mairix.el, thanks to the input of Bastien, this should be somewhat clean. It seems stable for me now. It would be great to see more MUAs and other backends added. CAUTION: The link encoding has changed another, last, I hope time! One of the most useful features of this, imho, is to have NEXT actions now where you get the entire thread in one group and automatically enter it at the email referenced in the link. Regards, Georg --20070927125841+0200-231696978105920563-9512 Content-Type: application/emacs-lisp Content-Disposition: attachment; filename=org-mairix.el Content-Transfer-Encoding: quoted-printable ;;; org-mairix.el - Support for hooking mairix search into Org for differen= t MUAs ;; ;; Copyright (C) 2007 Georg C. F. Greve ;; ;; Author: Georg C. F. Greve ;; Keywords: outlines, hypermedia, calendar, wp, email, mairix ;; Purpose: Integrate mairix email searching into Org mode ;; See http://orgmode.org and http://www.rpcurnow.force9.co.uk/mairix/ ;; Version: 0.3 ;; ;; This file 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. ;; It 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 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. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;= ;; ;; USAGE NOTE ;; ;; You will need to configure mairix first, which involves setting up your ;; .mairixrc in your home directory. Once it is working, you should set up ;; your way to display results in your favorite way -- usually a MUA, in my ;; case gnus. ;; ;; After both steps are done, all you should need to hook mairix, org ;; and your MUA together is to do (require 'org-mairix) in your ;; startup file. Everything can then be configured normally through ;; Emacs customisation. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;= ;; (require 'org) ;;; The custom variables (defgroup org-mairix nil "Mairix support/integration in org." :tag "Org Mairix" :group 'org) (defcustom org-mairix-threaded-links t "Should new links be created as threaded links? If t, links will be stored as threaded searches. If nil, links will be stored as non-threaded searches." :group 'org-mairix :type 'boolean) (defcustom org-mairix-augmented-links nil "Should new links be created as augmenting searches? If t, links will be stored as augmenting searches. If nil, links will be stored as normal searches. Attention: When activating this option, you will need to remove old articles from your mairix results group in some other way, mairix will not do it for you." :group 'org-mairix :type 'boolean) (defcustom org-mairix-display-hook 'org-mairix-gnus-display-results "Hook to call to display the results of a successful mairix search. Defaults to Gnus, feel free to add your own MUAs or methods." :group 'org-mairix :type 'hook) (defcustom org-mairix-executable "mairix" "The mairix executable to call. If your paths are set up correctly, you should not need to change this." :group 'org-mairix :type 'string) (defgroup org-mairix-gnus nil "Use gnus for mairix support in org." :tag "Org Mairix Gnus" :group 'org-mairix) (defcustom org-mairix-gnus-results-group "nnmaildir:mairix" "The group that is configured to hold the mairix search results, which needs to be setup independently of the org-mairix integration, along with general mairix configuration." :group 'org-mairix-gnus :type 'string) (defcustom org-mairix-gnus-select-display-group-function 'org-mairix-gnus-s= elect-display-group-function-gg "Hook to call to select the group that contains the matching articles. We should not need this, it is owed to a problem of gnus that people were not yet able to figure out, see http://article.gmane.org/gmane.emacs.gnus.general/65248 http://article.gmane.org/gmane.emacs.gnus.general/65265 http://article.gmane.org/gmane.emacs.gnus.user/9596 for reference. It seems gnus needs a 'forget/ignore everything you think you know about that group' function. Volunteers?" :group 'org-mairix-gnus :type 'hook) ;;; The hooks to integrate mairix into org (org-add-link-type "mairix" 'org-mairix-open) (add-hook 'org-store-link-functions 'org-mairix-store-link) ;;; Generic org-mairix functions (defun org-mairix-store-link () "Store a link to the current message as a Mairix search for its Message ID." ;; gnus integration (when (memq major-mode '(gnus-summary-mode gnus-article-mode)) (and (eq major-mode 'gnus-article-mode) (gnus-article-show-summary)) (let* ((article (gnus-summary-article-number)) (header (gnus-summary-article-header article)) (from (mail-header-from header)) (message-id (mail-header-id header)) (subject (gnus-summary-subject-string))) (org-store-link-props :type "mairix" :from from :subject subject :message-id message-id) (setq cpltxt (org-email-link-description)) (org-store-link-props :link (concat "mairix:" (if org-mairix-threaded-links "t:") (if org-mairix-augmented-links "a:") "@@" (org-remove-angle-brackets message-id)) :description cpltxt)))) (defun org-mairix-open (path) "Function to open mairix link. We first need to split it into its individual parts, and then extract the message-id to be passed on to the display function before call mairix, evaluate the number of matches returned, and make sure to only call display of mairix succeeded in matching." (let* ((cmdline org-mairix-executable)) (if (string< "t:" path) (progn (setq path (substring path 2 nil)) (setq cmdline (concat cmdline " --threads")))) (if (string< "a:" path) (progn (setq path (substring path 2 nil)) (setq cmdline (concat cmdline " --augment")))) (let* ((message-id (substring path 2 nil))) (setq cmdline (concat cmdline " m:" message-id)) (print cmdline) (setq retval (shell-command-to-string (concat cmdline " m:" message-id))) (string-match "\[0-9\]+" retval) (setq matches (string-to-number (match-string 0 retval))) (if (eq matches 0) (message "Link failed: no matches, sorry") (message "Link returned %d matches" matches) (run-hook-with-args 'org-mairix-display-hook message-id))))) ;;; Functions necessary for gnus integration (defun org-mairix-gnus-display-results (message-id) "Display results of mairix search in Gnus. Note: This does not work as cleanly as I would like it to. The problem being that Gnus should simply reread the group cleanly, without remembering anything. At the moment it seems to be unable to do that -- so you're likely to see zombies floating around. Gnus developers couldn't really help, see: http://article.gmane.org/gmane.emacs.gnus.general/65248 If you can improve this, please do!" (require 'gnus) (require 'gnus-sum) ;; FIXME: (bzg/gg) We might need to make sure gnus is running here, ;; and to start it in case it isn't running already. Does ;; anyone know a function to do that? It seems main org mode ;; does not do this, either. (funcall (cdr (assq 'gnus org-link-frame-setup))) (if gnus-other-frame-object (select-frame gnus-other-frame-object)) ;; FIXME: This is horribly broken. Please see ;; http://article.gmane.org/gmane.emacs.gnus.general/65248 ;; http://article.gmane.org/gmane.emacs.gnus.general/65265 ;; http://article.gmane.org/gmane.emacs.gnus.user/9596 ;; for reference. ;; ;; It seems gnus needs a "forget/ignore everything you think you ;; know about that group" function. Volunteers? ;; ;; For now different methods seem to work differently well for ;; different people. So we're playing hook-selection here to make ;; it easy to play around until we found a proper solution. (run-hook-with-args 'org-mairix-gnus-select-display-group-function) (gnus-group-quick-select-group 0 org-mairix-gnus-results-group) (gnus-summary-reselect-current-group t t) (gnus-summary-select-article nil t t (car (gnus-find-matching-articles "message-id" message-id)))) (provide 'org-mairix) (defun org-mairix-gnus-select-display-group-function-gg () "Georg's hack to select a group that gnus (falsely) believes to be empty to then call rebuilding of the summary. It leaves zombies of old searches around, though." (gnus-group-quick-select-group 0 org-mairix-gnus-results-group) (gnus-summary-reselect-current-group t t)) (defun org-mairix-gnus-select-display-group-function-bzg () "This is the classic way the org mode is using, and it seems to be using better for Bastien, so it may work for you." (gnus-group-read-group t nil org-mairix-gnus-results-group)) ;;; org-mairix.el ends here --20070927125841+0200-231696978105920563-9512 Content-Transfer-Encoding: quoted-printable =2D-=20 Georg C. F. Greve Free Software Foundation Europe (http://fsfeurope.org) Join the Fellowship and protect your freedom! (http://www.fsfe.org) What everyone should know about DRM (http://DRM.info) --20070927125841+0200-231696978105920563-9512-- --20070927125841+0200-178102340-29671576-226914545 Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iQCVAwUBRvuM4ik9sUy32wQcAQK0EAP/ewJl6P0MlXk5hvI7oQqcSkvyxb8V3WbA PAIx7fNl+/eIl6ve0JAragfxnC52jFPBMRFJXY480DX6MIeiJG1y5mE9SDaFII3m 4Mhr5IFvzsP8RnMzRVa3HK6FMgcWd+SMfWxRJ/7Pngo3PSDjiSw6M4/HAeHD0l2i WBzDJ4NQJaU= =1qz7 -----END PGP SIGNATURE----- --20070927125841+0200-178102340-29671576-226914545-- --===============0031636983== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ 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 --===============0031636983==--