;;; jao-notmuch-move.el --- Move messages around in notmuch -*- lexical-binding: t; -*- ;; Copyright (C) 2021, 2024 jao ;; Author: jao ;; Keywords: mail ;; 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: ;; Moving messages around ;;; Code: (require 'notmuch) (defvar jao-notmuch-mailboxes nil) (defvar jao-notmuch-mailboxes-rx nil) (defun jao-notmuch--path-to-mailbox (full-path) (unless jao-notmuch-mailboxes-rx (setq jao-notmuch-mailboxes-rx (regexp-opt jao-notmuch-mailboxes))) (if (string-match jao-notmuch-mailboxes-rx full-path) (match-string 0 full-path) (user-error "Message not in any registered mailbox!"))) (defun jao-notmuch--msg-props () (if-let* ((p (save-excursion (beginning-of-line) (text-property-search-forward :notmuch-message-properties)))) (prop-match-value p) (user-error "No message at point"))) (defun jao-notmuch--full-path () (seq-find #'file-exists-p (plist-get (jao-notmuch--msg-props) :filename))) (defun jao-notmuch--move (&optional full-path d) (let* ((full-path (or full-path (jao-notmuch--full-path))) (ff (jao-notmuch--path-to-mailbox full-path)) (d (or d (completing-read (format "From %s to: " ff) (remove ff jao-notmuch-mailboxes) nil t))) (dest (string-replace ff d full-path)) (dest (replace-regexp-in-string ",U=.+$" "m:2,S" dest)) (ftags (split-string ff "/")) (ttags (split-string d "/"))) (when (y-or-n-p (format "%s -> %s? " ftags ttags)) (notmuch-tree-close-message-window) (notmuch-tree-tag (append (notmuch-tag-change-list ftags t) (notmuch-tag-change-list ttags))) (rename-file (jao-notmuch--full-path) dest) (shell-command-to-string "notmuch new") (notmuch-refresh-this-buffer)))) (defun jao-notmuch-move-message () "Move message at point to another folder." (interactive) (jao-notmuch--move)) (provide 'jao-notmuch-move) ;;; jao-notmuch-move.el ends here