summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--piem-notmuch.el111
-rw-r--r--piem.texi4
3 files changed, 116 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 80f50c5..60545c8 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
# Rely on EMACSLOADPATH for everything but the current directory.
BATCH = emacs -Q --batch -L .
-all: loadpath piem.elc piem-b4.elc piem.info
+all: loadpath piem.elc piem-b4.elc piem-notmuch.elc piem.info
.PHONY: clean
clean:
diff --git a/piem-notmuch.el b/piem-notmuch.el
new file mode 100644
index 0000000..6ef6cdb
--- /dev/null
+++ b/piem-notmuch.el
@@ -0,0 +1,111 @@
+;;; piem-notmuch.el --- Notmuch integration for piem -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2020 Kyle Meyer
+
+;; Author: Kyle Meyer <kyle@kyleam.com>
+;; Keywords: vc, tools
+;; Version: 0.0.0
+;; Package-Requires: ((emacs "26.3"))
+
+;; 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 3 of the License, 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, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'message)
+(require 'notmuch)
+(require 'piem)
+(require 'subr-x)
+
+(defgroup piem-notmuch nil
+ "Notmuch integration for piem."
+ :link '(info-link "(piem)Notmuch integration")
+ :group 'piem)
+
+(defcustom piem-notmuch-executable "notmuch"
+ "Which notmuch executable to use."
+ :type 'string)
+
+(defmacro piem-notmuch--with-current-message (&rest body)
+ (let ((rv (make-symbol "rv")))
+ `(let (,rv)
+ (with-current-notmuch-show-message
+ (setq ,rv ,(macroexp-progn body)))
+ ,rv)))
+
+(defun piem-notmuch-get-inbox ()
+ "Return inbox name from a `notmuch-show-mode' buffer."
+ (pcase-let ((`(,listid ,to ,cc)
+ (when (derived-mode-p 'notmuch-show-mode)
+ (piem-notmuch--with-current-message
+ (message-narrow-to-headers-or-head)
+ (list (message-fetch-field "list-id")
+ (message-fetch-field "to")
+ (message-fetch-field "cc"))))))
+ (catch 'hit
+ (dolist (inbox piem-inboxes)
+ (let* ((info (cdr inbox))
+ (p-listid (plist-get info :listid)))
+ (when (and listid
+ p-listid
+ (string-match-p (concat "<" (regexp-quote p-listid) ">")
+ listid))
+ (throw 'hit (car inbox)))
+ (when-let ((addr (plist-get info :address))
+ (to (mapconcat #'identity (list to cc)
+ " ")))
+ (when (string-match-p (regexp-quote addr) to)
+ (throw 'hit (car inbox)))))))))
+
+(defun piem-notmuch-get-mid ()
+ "Return the message ID of a `notmuch-show-mode' buffer."
+ (notmuch-show-get-message-id 'bare))
+
+(defun piem-notmuch-mid-to-thread (mid)
+ "Return a function that inserts an mbox for MID's thread."
+ (let ((query (concat "id:" mid)))
+ (when (equal query
+ (string-trim-right
+ (with-output-to-string
+ (with-current-buffer standard-output
+ (call-process piem-notmuch-executable
+ nil '(t nil) nil
+ "search" "--output=messages" query)))))
+ (lambda ()
+ (call-process piem-notmuch-executable
+ nil '(t nil) nil
+ "show" "--format=mbox" "--entire-thread=true"
+ query)))))
+
+(define-minor-mode piem-notmuch-mode
+ "Toggle Notmuch support for piem.
+With a prefix argument ARG, enable piem-notmuch mode if ARG is
+positive, and disable it otherwise. If called from Lisp, enable
+the mode if ARG is omitted or nil."
+ :global t
+ :init-value nil
+ (if piem-notmuch-mode
+ (progn
+ (add-hook 'piem-get-inbox-functions #'piem-notmuch-get-inbox)
+ (add-hook 'piem-get-mid-functions #'piem-notmuch-get-mid)
+ (add-hook 'piem-mid-to-thread-functions #'piem-notmuch-mid-to-thread))
+ (remove-hook 'piem-get-inbox-functions #'piem-notmuch-get-inbox)
+ (remove-hook 'piem-get-mid-functions #'piem-notmuch-get-mid)
+ (remove-hook 'piem-mid-to-thread-functions #'piem-notmuch-mid-to-thread)))
+
+;;; piem-notmuch.el ends here
+(provide 'piem-notmuch)
diff --git a/piem.texi b/piem.texi
index 137a7cb..5679006 100644
--- a/piem.texi
+++ b/piem.texi
@@ -46,6 +46,7 @@ This manual is for piem version @value{VERSION}.
@menu
* Overview::
* b4 interface::
+* Notmuch integration::
* Related tools::
* Contributing::
@@ -68,6 +69,9 @@ Indices
@node b4 interface
@chapter b4 interface
+@node Notmuch integration
+@chapter Notmuch integration
+
@node Related tools
@chapter Related tools