From a5dd24f754efd5762b642d39e1234f4b7ba2252c Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Sun, 3 May 2020 02:17:07 -0400 Subject: Add basic support for Notmuch --- Makefile | 2 +- piem-notmuch.el | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ piem.texi | 4 ++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 piem-notmuch.el 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 +;; 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 . + +;;; 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 -- cgit v1.2.3