From bbc055d75a51ff1e8e2ff2fc7a3153f78323e2bb Mon Sep 17 00:00:00 2001 From: Pierre Neidhardt Date: Mon, 14 Jan 2019 09:22:28 +0100 Subject: [PATCH] mu4e: Implement mu4e-*-mark-or-move-to-trash (e.g. for Gmail) --- mu4e/mu4e-headers.el | 27 +++++++++++++++++++++++++-- mu4e/mu4e-view.el | 9 ++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/mu4e/mu4e-headers.el b/mu4e/mu4e-headers.el index 0bf627fa..ba1e6671 100644 --- a/mu4e/mu4e-headers.el +++ b/mu4e/mu4e-headers.el @@ -742,6 +742,29 @@ after the end of the search results." (mu4e~headers-defun-mark-for unread) (mu4e~headers-defun-mark-for action) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defvar mu4e-move-to-trash-patterns '() + "List of regexps to match for moving to trash instead of flagging them. +This is particularly useful for mailboxes that don't use the +trash flag like Gmail. See `mu4e-headers-mark-or-move-to-trash' +and `mu4e-view-mark-or-move-to-trash'.") + +(defun mu4e-headers-mark-or-move-to-trash () + "Mark message for \"move\" to the trash folder if the message +maildir matches any regexp in `mu4e-move-to-trash-patterns'. +Otherwise mark with the \"trash\" flag. +Also see `mu4e-view-mark-or-move-to-trash'." + (interactive) + (let ((msg-dir (mu4e-message-field (mu4e-message-at-point) :maildir))) + (if (not (seq-filter (lambda (re) + (string-match re msg-dir)) + mu4e-move-to-trash-patterns)) + (mu4e-headers-mark-for-trash) + (mu4e-mark-set 'move (if (functionp mu4e-trash-folder) + (funcall mu4e-trash-folder (mu4e-message-at-point)) + mu4e-trash-folder)) + (mu4e-headers-next)))) + ;;; headers-mode and mode-map ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar mu4e-headers-mode-map nil "Keymap for *mu4e-headers* buffers.") @@ -801,8 +824,8 @@ after the end of the search results." (define-key map "y" 'mu4e-select-other-view) ;; marking/unmarking ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (define-key map (kbd "") 'mu4e-headers-mark-for-trash) - (define-key map (kbd "d") 'mu4e-headers-mark-for-trash) + (define-key map (kbd "") 'mu4e-headers-mark-or-move-to-trash) + (define-key map (kbd "d") 'mu4e-headers-mark-or-move-to-trash) (define-key map (kbd "") 'mu4e-headers-mark-for-delete) (define-key map (kbd "") 'mu4e-headers-mark-for-delete) (define-key map (kbd "D") 'mu4e-headers-mark-for-delete) diff --git a/mu4e/mu4e-view.el b/mu4e/mu4e-view.el index 4e8378d7..5a12fee9 100644 --- a/mu4e/mu4e-view.el +++ b/mu4e/mu4e-view.el @@ -743,7 +743,7 @@ FUNC should be a function taking two arguments: (define-key map "A" (if mu4e-view-use-gnus 'ignore 'mu4e-view-attachment-action)) ;; marking/unmarking - (define-key map "d" 'mu4e-view-mark-for-trash) + (define-key map "d" 'mu4e-view-mark-or-move-to-trash) (define-key map (kbd "") 'mu4e-view-mark-for-delete) (define-key map (kbd "") 'mu4e-view-mark-for-delete) (define-key map (kbd "D") 'mu4e-view-mark-for-delete) @@ -1487,6 +1487,13 @@ list." (mu4e~view-in-headers-context (mu4e-mark-execute-all))) +(defun mu4e-view-mark-or-move-to-trash (&optional n) + "See `mu4e-headers-mark-or-move-to-trash'." + (interactive "P") + (mu4e~view-in-headers-context + (mu4e-headers-mark-or-move-to-trash) + (mu4e~headers-move (or n 1)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; URL handling (defun mu4e~view-get-urls-num (prompt &optional multi)