summaryrefslogtreecommitdiffhomepage
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/net/jao-notmuch.el72
1 files changed, 45 insertions, 27 deletions
diff --git a/lib/net/jao-notmuch.el b/lib/net/jao-notmuch.el
index 85c241e..de1885f 100644
--- a/lib/net/jao-notmuch.el
+++ b/lib/net/jao-notmuch.el
@@ -41,25 +41,30 @@
(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 mailbox!")))
+ (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--move (full-path &optional d seen)
- (let* ((ff (jao-notmuch--path-to-mailbox full-path))
+(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 seen)
+ (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=.+$" (if seen "m,S" "m") dest))
- (fnd (file-name-nondirectory full-path))
- (dnd (file-name-nondirectory dest)))
- (when (y-or-n-p (format "%s/%s -> %s/%s? " ff fnd d dnd))
- (notmuch-tree-tag (append (notmuch-tag-change-list (split-string ff "/") t)
- (notmuch-tag-change-list (split-string d "/"))))
+ (ftags (split-string ff "/"))
+ (ttags (split-string d "/")))
+ (when (y-or-n-p (format "%s -> %s? " ftags ttags))
+ (notmuch-tree-tag (append (notmuch-tag-change-list ftags t)
+ (notmuch-tag-change-list ttags)))
(notmuch-tree-close-message-window)
(rename-file full-path dest)
(shell-command-to-string "notmuch new")
@@ -68,18 +73,7 @@
(defun jao-notmuch-move-message ()
"Move message at point to another folder."
(interactive)
- (let* ((p (jao-notmuch--msg-props))
- (f (car (plist-get p :filename))))
- (jao-notmuch--move (or f ""))))
-
-(defun jao-notmuch-tree-spam ()
- "Move message at point to the spam folder."
- (interactive)
- (let* ((p (jao-notmuch--msg-props))
- (f (car (plist-get p :filename)))
- (mbox (car (split-string (jao-notmuch--path-to-mailbox f) "/"))))
- (notmuch-tree-tag '("-new" "-unread"))
- (jao-notmuch--move f (concat mbox "/spam") t)))
+ (jao-notmuch--move))
;; Targetting the displayed message from the tree view
@@ -140,30 +134,49 @@
;; Keeping track of unread messages in current tree view
+(defvar-local jao-notmuch--query-name nil)
+
+(defun jao-notmuch--query-name ()
+ (when notmuch-tree-basic-query
+ (or jao-notmuch--query-name
+ (setq jao-notmuch--query-name
+ (let ((q (seq-find (lambda (q)
+ (string= (or (plist-get q :query) "")
+ notmuch-tree-basic-query))
+ notmuch-saved-searches)))
+ (or (plist-get q :name) notmuch-tree-basic-query))))))
+
(defun jao-notmuch--unread-count ()
(save-excursion
(goto-char (point-min))
- (let ((p) (cnt))
+ (let ((p) (cnt) (total))
(while (setq p (text-property-search-forward :notmuch-message-properties))
- (unless cnt (setq cnt 0))
+ (unless cnt (setq cnt 0 total 0))
(let ((tags (plist-get (prop-match-value p) :tags)))
+ (setq total (1+ total))
(when (or (member "unread" tags) (member "new" tags))
(setq cnt (1+ cnt)))))
- cnt)))
+ (when cnt (format "%s out of %s messages left" cnt total)))))
(defun jao-notmuch--tree-update-buffer-name (&optional n)
(when-let ((n (or n (jao-notmuch--unread-count))))
- (rename-buffer (format "*%s - {%s messages left}*"
- notmuch-tree-basic-query
- n))
+ (rename-buffer (format "{%s - %s}" (jao-notmuch--query-name) n))
(jao-minibuffer-refresh)))
+(defun jao-notmuch--tree-sentinel (proc &rest _)
+ (let ((buffer (process-buffer proc))
+ (status (process-status proc)))
+ (when (and (eq status 'exit) (buffer-live-p buffer))
+ (with-current-buffer buffer (jao-notmuch--tree-update-buffer-name)))))
+
+(advice-add 'notmuch-tree-process-sentinel :after #'jao-notmuch--tree-sentinel)
+
(defun jao-notmuch-echo-count ()
"Show the number of unread messages left in this tree view."
(interactive)
(when-let ((n (jao-notmuch--unread-count)))
(jao-notmuch--tree-update-buffer-name n)
- (message "%s messages left" n)))
+ (message n)))
(defun jao-notmuch-tree-next (thread &optional no-exit)
"Next message or thread in forest or exit if none."
@@ -198,6 +211,11 @@
(interactive)
(jao-notmuch-tree--tag-and-next '("-unread" "-new") nil t))
+(defun jao-notmuch-tree-spam (unmark)
+ (interactive "P")
+ (let ((tags (if unmark '("-spam") '("-unread" "-new" "+spam"))))
+ (jao-notmuch-tree--tag-and-next tags nil nil)))
+
;; Scrolling the shown message
(defun jao-notmuch-tree-scroll-or-next ()