123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- ;;; org-mairix.el ---
- ;; Copyright 2007 Bastien Guerry
- ;;
- ;; Author: Bastien.Guerry@ens.fr
- ;; Version: $Id: org-mairix.el,v 0.0 2007/08/11 17:23:40 guerry Exp $
- ;; Keywords:
- ;; X-URL: not distributed yet
- ;; This program 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 2, or (at your option)
- ;; any later version.
- ;;
- ;; This program 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.
- ;;; Commentary:
- ;; Code and ideas from Carsten Dominik, Adam Spiers and Georg C. F. Greve.
- ;; Put this file into your load-path and the following into your ~/.emacs:
- ;; (require 'org-mairix)
- ;;; Code:
- (require 'org)
- (defgroup org-mairix nil
- "Mairix link support for Org."
- :tag "Org Mairix"
- :group 'org)
- (defcustom mairix-results-group "nnmaildir+index:mfolder"
- "Gnus groupe where to list mairix search results."
- :group 'org-mairix
- :type '(string))
- (defun org-add-link-type (type &optional follow publish)
- "Add TYPE to the list of `org-link-types'.
- Re-compute all regular expressions depending on `org-link-types'."
- (add-to-list 'org-link-types type t)
- (setq org-link-re-with-space
- (concat
- "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
- "\\([^" org-non-link-chars " ]"
- "[^" org-non-link-chars "]*"
- "[^" org-non-link-chars " ]\\)>?"))
- (setq org-link-re-with-space2
- (concat
- "<?\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
- "\\([^" org-non-link-chars " ]"
- "[^]\t\n\r]*"
- "[^" org-non-link-chars " ]\\)>?"))
- (setq org-angle-link-re
- (concat
- "<\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
- "\\([^" org-non-link-chars " ]"
- "[^" org-non-link-chars "]*"
- "\\)>"))
- (setq org-plain-link-re
- (concat
- "\\(" (mapconcat 'identity org-link-types "\\|") "\\):"
- "\\([^]\t\n\r<>,;() ]+\\)"))
- (setq org-bracket-link-analytic-regexp
- (concat
- "\\[\\["
- "\\(\\(" (mapconcat 'identity org-link-types "\\|") "\\):\\)?"
- "\\([^]]+\\)"
- "\\]"
- "\\(\\[" "\\([^]]+\\)" "\\]\\)?"
- "\\]"))
- (add-hook 'org-follow-link-functions follow)
- (add-hook 'org-publish-link-functions publish))
- (defun org-mairix-follow-link (path)
- "Follow a Mairix link."
- (require 'gnus)
- (funcall (cdr (assq 'gnus org-link-frame-setup)))
- (if gnus-other-frame-object (select-frame gnus-other-frame-object))
- (mairix-search path))
- (defun org-mairix-publish-link (path)
- "Convert mairix PATH into a (dummy) raw link."
- ;; FIXME: should we have a format argument for HTML/LaTeX publishing?
- (if (string-match org-bracket-link-analytic-regexp path)
- (match-string 5 path) path))
- (defun org-mairix-store-link (path)
- "Store a mairix link."
- (when (memq major-mode '(gnus-summary-mode gnus-article-mode))
- (let* ((group gnus-newsgroup-name)
- (article (gnus-summary-article-number))
- (header (gnus-summary-article-header article))
- (from (mail-header-from header))
- (message-id (mail-header-id header))
- (date (mail-header-date header))
- (subject (gnus-summary-subject-string)))
- (org-store-link-props :type "mairix"
- :from from
- :subject subject
- :message-id message-id
- :group group)
- ;; FIXME: what about cpltxt and link vars we used so far?
- ;; (setq cpltxt (org-email-link-description))
- ;; (setq link (org-make-link "mairix:m:"
- ;; (substring message-id 1 -1))))))
- (org-make-link "mairix:m:" (substring message-id 1 -1)))))
- ;; mairix internals
- (defun mairix-result-evaluate (string)
- "Display search results of previous mairix process."
- (let ((mmatches (string-to-number (substring string 7 -8))))
- (if (eq mmatches 0)
- (message "Mairix returned no matches, sorry.")
- (message "Mairix returned %d matches." mmatches)
- (gnus-group-quick-select-group 0 mairix-results-group)
- (gnus-summary-reselect-current-group t t))))
- (org-add-link-type "mairix"
- 'org-mairix-follow-link
- 'org-mairix-publish-link)
- (add-hook 'org-store-link-functions 'org-mairix-store-link)
- (defun mairix-search (string)
- "Uses mairix to search through my mail, replacing current search results."
- (interactive "MMairix search: ")
- (mairix-result-evaluate
- (shell-command-to-string (concat "mairix " string))))
- (provide 'org-mairix)
- (eval-when-compile
- (require 'cl))
- ;;;;##########################################################################
- ;;;; User Options, Variables
- ;;;;##########################################################################
- ;;; org-mairix.el ends here
|