diff options
Diffstat (limited to 'lib/net')
| -rw-r--r-- | lib/net/jao-notmuch.el | 72 | 
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 ()  | 
