From 5779820ba099b0f04cf9450682e08abf711f1d29 Mon Sep 17 00:00:00 2001 From: djcb Date: Thu, 27 Sep 2012 21:53:21 +0300 Subject: [PATCH] * mu4e: dynamic folder updates --- mu4e/mu4e-headers.el | 59 +++++++++++++++++----------------- mu4e/mu4e-mark.el | 11 ++++--- mu4e/mu4e-utils.el | 5 ++- mu4e/mu4e-view.el | 75 ++++++++++++++------------------------------ 4 files changed, 63 insertions(+), 87 deletions(-) diff --git a/mu4e/mu4e-headers.el b/mu4e/mu4e-headers.el index d5e4f24b..165ab660 100644 --- a/mu4e/mu4e-headers.el +++ b/mu4e/mu4e-headers.el @@ -390,9 +390,9 @@ after the end of the search results." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defmacro mu4e~headers-defun-mark-func (mark) +(defmacro mu4e~headers-defun-mark-for (mark) "Define a function mu4e~headers-mark-MARK." - (let ((funcname (intern (concat "mu4e~headers-mark-" (symbol-name mark)))) + (let ((funcname (intern (concat "mu4e-headers-mark-for-" (symbol-name mark)))) (docstring (concat "Mark header at point with " (symbol-name mark) "."))) `(defun ,funcname () ,docstring (interactive) @@ -401,16 +401,16 @@ after the end of the search results." ;; define our mark functions; there must be some way to do this in a loop but ;; since `mu4e~headers-defun-mark-func' is a macro, the argument must be a ;; literal value. -(mu4e~headers-defun-mark-func refile) -(mu4e~headers-defun-mark-func deferred) -(mu4e~headers-defun-mark-func delete) -(mu4e~headers-defun-mark-func flag) -(mu4e~headers-defun-mark-func move) -(mu4e~headers-defun-mark-func read) -(mu4e~headers-defun-mark-func trash) -(mu4e~headers-defun-mark-func unflag) -(mu4e~headers-defun-mark-func unmark) -(mu4e~headers-defun-mark-func unread) +(mu4e~headers-defun-mark-for refile) +(mu4e~headers-defun-mark-for deferred) +(mu4e~headers-defun-mark-for delete) +(mu4e~headers-defun-mark-for flag) +(mu4e~headers-defun-mark-for move) +(mu4e~headers-defun-mark-for read) +(mu4e~headers-defun-mark-for trash) +(mu4e~headers-defun-mark-for unflag) +(mu4e~headers-defun-mark-for unmark) +(mu4e~headers-defun-mark-for unread) ;;; headers-mode and mode-map ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -468,25 +468,24 @@ after the end of the search results." (define-key map "y" 'mu4e-select-other-view) ;; marking/unmarking ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (define-key map (kbd "") 'mu4e~headers-mark-trash) - (define-key map (kbd "d") 'mu4e~headers-mark-trash) - (define-key map (kbd "") 'mu4e~headers-mark-delete) - (define-key map (kbd "") 'mu4e~headers-mark-delete) - (define-key map (kbd "D") 'mu4e~headers-mark-delete) - (define-key map (kbd "m") 'mu4e~headers-mark-move) - (define-key map (kbd "r") 'mu4e~headers-mark-refile) + (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-for-delete) + (define-key map (kbd "") 'mu4e-headers-mark-for-delete) + (define-key map (kbd "D") 'mu4e-headers-mark-for-delete) + (define-key map (kbd "m") 'mu4e-headers-mark-for-move) + (define-key map (kbd "r") 'mu4e-headers-mark-for-refile) + + (define-key map (kbd "o") 'mu4e-headers-mark-for-unread) + (define-key map (kbd "s") 'mu4e-headers-mark-for-read) + + (define-key map (kbd "u") 'mu4e-headers-mark-for-unmark) + (define-key map (kbd "+") 'mu4e-headers-mark-for-flag) + (define-key map (kbd "-") 'mu4e-headers-mark-for-unflag) + (define-key map (kbd "&") 'mu4e-headers-mark-for-custom) - (define-key map (kbd "o") 'mu4e~headers-mark-unread) - (define-key map (kbd "s") 'mu4e~headers-mark-read) - - (define-key map (kbd "u") 'mu4e~headers-mark-unmark) - (define-key map (kbd "+") 'mu4e~headers-mark-flag) - (define-key map (kbd "-") 'mu4e~headers-mark-unflag) - (define-key map (kbd "&") 'mu4e-headers-mark-custom) - - - (define-key map (kbd "*") 'mu4e~headers-mark-deferred) - (define-key map (kbd "") 'mu4e~headers-mark-deferred) + (define-key map (kbd "*") 'mu4e-headers-mark-for-deferred) + (define-key map (kbd "") 'mu4e-headers-mark-for-deferred) (define-key map (kbd "#") 'mu4e-mark-resolve-deferred-marks) (define-key map "U" 'mu4e-mark-unmark-all) diff --git a/mu4e/mu4e-mark.el b/mu4e/mu4e-mark.el index daf239cc..a1bf16eb 100644 --- a/mu4e/mu4e-mark.el +++ b/mu4e/mu4e-mark.el @@ -172,10 +172,11 @@ provided, function asks for it." "Mark the header at point, or, if region is active, mark all headers in the region. Optionally, provide TARGET (for moves)." (let ((target ;; ask or check the target if it's a move - (case mark - ('refile (mu4e-get-refile-folder (mu4e-message-at-point))) - ('move (mu4e~mark-get-move-target target)) - ('trash (mu4e-get-trash-folder (mu4e-message-at-point))) ))) + (or target + (case mark + (refile (mu4e-get-refile-folder (mu4e-message-at-point))) + (move (mu4e~mark-get-move-target target)) + (trash (mu4e-get-trash-folder (mu4e-message-at-point))) )))) (if (not (use-region-p)) ;; single message (mu4e-mark-at-point mark target) @@ -186,7 +187,7 @@ headers in the region. Optionally, provide TARGET (for moves)." (while (<= (line-beginning-position) e) (setq target ;; refile/trash targets are determined per-message (case mark - (refile (mu4e-get-refile-folder (mu4e-message-at-point))) + (refile (mu4e-get-refile-folder (mu4e-message-at-point))) (trash (mu4e-get-trash-folder (mu4e-message-at-point))) (t target))) (mu4e-mark-at-point mark target) diff --git a/mu4e/mu4e-utils.el b/mu4e/mu4e-utils.el index 250eeaba..804e3b32 100644 --- a/mu4e/mu4e-utils.el +++ b/mu4e/mu4e-utils.el @@ -521,7 +521,10 @@ This is used by the completion function in mu4e-compose." (and mu4e-compose-complete-ignore-address-regexp (string-match mu4e-compose-complete-ignore-address-regexp mail)) (add-to-list 'lst - (if name (format "\"%s\" <%s>" name mail) mail)))))) + (if name (format "\"%s\" <%s>" + ;; hack so we don't get ',' in e-mail addresses... + (replace-regexp-in-string "," "" name) + mail) mail)))))) (setq mu4e~contacts-for-completion lst) (mu4e-message "Contacts received: %d" (length mu4e~contacts-for-completion)))) diff --git a/mu4e/mu4e-view.el b/mu4e/mu4e-view.el index c041ee02..5945693b 100644 --- a/mu4e/mu4e-view.el +++ b/mu4e/mu4e-view.el @@ -546,7 +546,7 @@ at POINT, or if nil, at (point)." (define-key map (kbd "D") 'mu4e-view-mark-for-delete) (define-key map (kbd "m") 'mu4e-view-mark-for-move) (define-key map (kbd "r") 'mu4e-view-mark-for-refile) - + (define-key map (kbd "&") 'mu4e-view-mark-custom) (define-key map (kbd "+") 'mu4e-view-mark-flag) @@ -559,7 +559,7 @@ at POINT, or if nil, at (point)." ;; misc (define-key map "w" 'longlines-mode) (define-key map "h" 'mu4e-view-toggle-hide-cited) - + ;; next 3 only warn user when attempt in the message view (define-key map "u" 'mu4e-view-unmark) (define-key map "U" 'mu4e-view-unmark-all) @@ -1059,15 +1059,7 @@ attachments) in response to a (mu4e~proc-extract 'temp ... )." (setq buffer-read-only t)) (t (mu4e-error "Unsupported action %S" what)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; marking -(defun mu4e~view-mark-set (mark) - "Set mark on the current messages." - (let ((docid (mu4e-msg-field mu4e~view-msg :docid))) - (mu4e~view-in-headers-context - (mu4e-mark-at-point mark)))) - -(defun mu4e-view-mark-custom () + (defun mu4e-view-mark-custom () "Run some custom mark function." (mu4e~view-in-headers-context (mu4e-headers-mark-custom))) @@ -1089,50 +1081,31 @@ user that unmarking only works in the header list." user that unmarking only works in the header list." (interactive) (if (mu4e~split-view-p) - (mu4e~view-mark-set 'unmark) + (mu4e-view-mark-for-unmark) (mu4e-message "Unmarking needs to be done in the header list view"))) -(defun mu4e-view-mark-for-move () - "Mark the current message for moving." - (interactive) - (mu4e~view-mark-set 'move) - (mu4e-view-headers-next)) +(defmacro mu4e~view-defun-mark-for (mark) + "Define a function mu4e-view-mark-for-MARK." + (let ((funcname (intern (concat "mu4e-view-mark-for-" (symbol-name mark)))) + (docstring (concat "Mark the current message for " (symbol-name mark) "."))) + `(defun ,funcname () ,docstring + (interactive) + (mu4e~view-in-headers-context + (mu4e-headers-mark-and-next (quote mark)))))) -(defun mu4e-view-mark-for-trash () - "Mark the current message for moving to the trash folder." - (interactive) - (mu4e~view-mark-set 'trash) - (mu4e-view-headers-next)) +;; would be cool to do something like the following, but somehow, I can't get +;; the quoting right... +;; (dolist (mark '(move trash refile delete flag unflag unmark deferred)) +;; (mu4e~view-defun-mark-for mark)) -(defun mu4e-view-mark-for-refile () - "Mark the current message for refiling." - (interactive) - (mu4e~view-mark-set 'refile) - (mu4e-view-headers-next)) - -(defun mu4e-view-mark-for-delete () - "Mark the current message for deletion." - (interactive) - (mu4e~view-mark-set 'delete) - (mu4e-view-headers-next)) - -(defun mu4e-view-mark-flag () - "Mark the current message for flagging." - (interactive) - (mu4e~view-mark-set 'flag) - (mu4e-view-headers-next)) - -(defun mu4e-view-mark-unflag () - "Mark the current message for unflagging." - (interactive) - (mu4e~view-mark-set 'unflag) - (mu4e-view-headers-next)) - -(defun mu4e-view-mark-deferred () - "Mark the current message for unflagging." - (interactive) - (mu4e~view-mark-set 'deferred) - (mu4e-view-headers-next)) +(mu4e~view-defun-mark-for move) +(mu4e~view-defun-mark-for trash) +(mu4e~view-defun-mark-for refile) +(mu4e~view-defun-mark-for delete) +(mu4e~view-defun-mark-for flag) +(mu4e~view-defun-mark-for unflag) +(mu4e~view-defun-mark-for unmark) +(mu4e~view-defun-mark-for deferred) (defun mu4e-view-marked-execute () "Execute the marks."