mu4e: tweak main-view updating

This commit is contained in:
Dirk-Jan C. Binnema 2023-01-17 20:45:32 +02:00
parent d7eed9e9ff
commit 74fb72035a
3 changed files with 83 additions and 95 deletions

View File

@ -1541,6 +1541,8 @@ region if there is a region, then move to the next message."
(interactive) (interactive)
(mu4e-mark-handle-when-leaving) (mu4e-mark-handle-when-leaving)
(quit-window t) (quit-window t)
;; clear the decks before going to the main-view
(mu4e--query-items-refresh 'reset-baseline)
(mu4e--main-view)) (mu4e--main-view))

View File

@ -121,10 +121,7 @@ the personal addresses."
(define-key map "S" #'mu4e-kill-update-mail) (define-key map "S" #'mu4e-kill-update-mail)
(define-key map (kbd "C-S-u") #'mu4e-update-mail-and-index) (define-key map (kbd "C-S-u") #'mu4e-update-mail-and-index)
(define-key map ";" (define-key map ";" #'mu4e-context-switch)
(lambda()(interactive)
(mu4e-context-switch)(revert-buffer)))
(define-key map "$" #'mu4e-show-log) (define-key map "$" #'mu4e-show-log)
(define-key map "A" #'mu4e-about) (define-key map "A" #'mu4e-about)
(define-key map "N" #'mu4e-news) (define-key map "N" #'mu4e-news)
@ -162,11 +159,7 @@ the personal addresses."
(setq-local revert-buffer-function (setq-local revert-buffer-function
(lambda (_ignore-auto _noconfirm) (lambda (_ignore-auto _noconfirm)
;; reset the baseline and get updated results. ;; reset the baseline and get updated results.
(mu4e--query-items-refresh 'reset-baseline))) (mu4e--query-items-refresh 'reset-baseline))))
(add-hook 'mu4e-query-items-updated-hook
(lambda ()
(when (get-buffer mu4e-main-buffer-name)
(mu4e--main-redraw-buffer))) nil t))
(defun mu4e--main-action-str (str &optional func-or-shortcut) (defun mu4e--main-action-str (str &optional func-or-shortcut)
"Highlight the first occurrence of [.] in STR. "Highlight the first occurrence of [.] in STR.
@ -246,81 +239,81 @@ character of the keyboard shortcut
(current-time-string baseline-t) (current-time-string baseline-t)
"Never")))) "Never"))))
(defun mu4e--main-redraw-buffer () (defun mu4e--main-redraw ()
"Redraw the main buffer." "Redraw the main buffer if there is one.
(with-current-buffer mu4e-main-buffer-name Otherwise, do nothing."
(let* ((inhibit-read-only t) (when (buffer-live-p (get-buffer mu4e-main-buffer-name))
(pos (point)) (with-current-buffer mu4e-main-buffer-name
(addrs (mu4e-personal-addresses)) (let* ((inhibit-read-only t)
(max-length (seq-reduce (lambda (a b) (pos (point))
(max a (length (plist-get b :name)))) (addrs (mu4e-personal-addresses))
(mu4e-query-items) 0))) (max-length (seq-reduce (lambda (a b)
(erase-buffer) (max a (length (plist-get b :name))))
(insert (mu4e-query-items) 0)))
"* " (erase-buffer)
(propertize "mu4e" 'face 'mu4e-header-key-face) (insert
(propertize " - mu for emacs version " 'face 'mu4e-title-face) "* "
(propertize mu4e-mu-version 'face 'mu4e-header-key-face) (propertize "mu4e" 'face 'mu4e-header-key-face)
"\n\n" (propertize " - mu for emacs version " 'face 'mu4e-title-face)
(propertize " Basics\n\n" 'face 'mu4e-title-face) (propertize mu4e-mu-version 'face 'mu4e-header-key-face)
(mu4e--main-action-str "\n\n"
"\t* [j]ump to some maildir\n" #'mu4e-search-maildir) (propertize " Basics\n\n" 'face 'mu4e-title-face)
(mu4e--main-action-str (mu4e--main-action-str
"\t* enter a [s]earch query\n" #'mu4e-search) "\t* [j]ump to some maildir\n" #'mu4e-search-maildir)
(mu4e--main-action-str (mu4e--main-action-str
"\t* [C]ompose a new message\n" #'mu4e-compose-new) "\t* enter a [s]earch query\n" #'mu4e-search)
"\n" (mu4e--main-action-str
(propertize " Bookmarks\n\n" 'face 'mu4e-title-face) "\t* [C]ompose a new message\n" #'mu4e-compose-new)
(mu4e--main-items (mu4e-query-items 'bookmarks) ?b max-length) "\n"
"\n" (propertize " Bookmarks\n\n" 'face 'mu4e-title-face)
(propertize " Maildirs\n\n" 'face 'mu4e-title-face) (mu4e--main-items (mu4e-query-items 'bookmarks) ?b max-length)
(mu4e--main-items (mu4e-query-items 'maildirs) ?j max-length) "\n"
"\n" (propertize " Maildirs\n\n" 'face 'mu4e-title-face)
(propertize " Misc\n\n" 'face 'mu4e-title-face) (mu4e--main-items (mu4e-query-items 'maildirs) ?j max-length)
"\n"
(propertize " Misc\n\n" 'face 'mu4e-title-face)
(mu4e--main-action-str "\t* [;]Switch context\n" (mu4e--main-action-str "\t* [;]Switch context\n" #'mu4e-context-switch)
(lambda()(interactive) (mu4e--main-action-str "\t* [U]pdate email & database\n"
(mu4e-context-switch)(revert-buffer))) #'mu4e-update-mail-and-index)
;; show the queue functions if `smtpmail-queue-dir' is defined
(if (file-directory-p smtpmail-queue-dir)
(mu4e--main-view-queue)
"")
"\n"
(mu4e--main-action-str "\t* [N]ews\n" #'mu4e-news)
(mu4e--main-action-str "\t* [A]bout mu4e\n" #'mu4e-about)
(mu4e--main-action-str "\t* [H]elp\n" #'mu4e-display-manual)
(mu4e--main-action-str "\t* [q]uit\n" #'mu4e-quit)
"\n"
(propertize " Info\n\n" 'face 'mu4e-title-face)
(mu4e--key-val "last updated"
(current-time-string
(plist-get mu4e-index-update-status :tstamp)))
(mu4e--key-val "database-path" (mu4e-database-path))
(mu4e--key-val "maildir" (mu4e-root-maildir))
(mu4e--key-val "in store"
(format "%d" (plist-get mu4e--server-props :doccount))
"messages")
(if mu4e-main-hide-personal-addresses ""
(mu4e--key-val "personal addresses"
(if addrs (mapconcat #'identity addrs ", " ) "none"))))
(mu4e--main-action-str "\t* [U]pdate email & database\n" (if mu4e-main-hide-personal-addresses ""
#'mu4e-update-mail-and-index) (unless (mu4e-personal-address-p user-mail-address)
;; show the queue functions if `smtpmail-queue-dir' is defined (mu4e-message (concat
(if (file-directory-p smtpmail-queue-dir) "Tip: `user-mail-address' ('%s') is not part "
(mu4e--main-view-queue) "of mu's addresses; add it with 'mu init
"")
"\n"
(mu4e--main-action-str "\t* [N]ews\n" #'mu4e-news)
(mu4e--main-action-str "\t* [A]bout mu4e\n" #'mu4e-about)
(mu4e--main-action-str "\t* [H]elp\n" #'mu4e-display-manual)
(mu4e--main-action-str "\t* [q]uit\n" #'mu4e-quit)
"\n"
(propertize " Info\n\n" 'face 'mu4e-title-face)
(mu4e--key-val "last updated"
(current-time-string
(plist-get mu4e-index-update-status :tstamp)))
(mu4e--key-val "database-path" (mu4e-database-path))
(mu4e--key-val "maildir" (mu4e-root-maildir))
(mu4e--key-val "in store"
(format "%d" (plist-get mu4e--server-props :doccount))
"messages")
(if mu4e-main-hide-personal-addresses ""
(mu4e--key-val "personal addresses"
(if addrs (mapconcat #'identity addrs ", " ) "none"))))
(if mu4e-main-hide-personal-addresses ""
(unless (mu4e-personal-address-p user-mail-address)
(mu4e-message (concat
"Tip: `user-mail-address' ('%s') is not part "
"of mu's addresses; add it with 'mu init
--my-address='") user-mail-address))) --my-address='") user-mail-address)))
(mu4e-main-mode) (mu4e-main-mode)
(goto-char pos)))) (goto-char pos)))))
(defun mu4e--main-view-queue () (defun mu4e--main-view-queue ()
"Display queue-related actions in the main view." "Display queue-related actions in the main view."
(concat (concat
(mu4e--main-action-str "\t* toggle [m]ail sending mode " (mu4e--main-action-str "\t* toggle [m]ail sending mode "
'mu4e--main-toggle-mail-sending-mode) 'mu4e--main-toggle-mail-sending-mode)
"(currently " "(currently "
(propertize (if smtpmail-queue-mail "queued" "direct") (propertize (if smtpmail-queue-mail "queued" "direct")
'face 'mu4e-header-key-face) 'face 'mu4e-header-key-face)
@ -346,24 +339,17 @@ character of the keyboard shortcut
(declare-function mu4e--start "mu4e") (declare-function mu4e--start "mu4e")
(defun mu4e--main-view (&optional refresh) (defun mu4e--main-view ()
"(Re)create the mu4e main-view, and switch to it. "(Re)create the mu4e main-view, and switch to it.
With non-nil REFRESH, refresh queries and baseline first.
If `mu4e-split-view' equals \='single-window, show a mu4e menu If `mu4e-split-view' equals \='single-window, show a mu4e menu
instead." instead."
(if (eq mu4e-split-view 'single-window) (if (eq mu4e-split-view 'single-window)
(mu4e--main-menu) (mu4e--main-menu)
(let ((buf (get-buffer-create mu4e-main-buffer-name)) (let ((buf (get-buffer-create mu4e-main-buffer-name))
(inhibit-read-only t)) (inhibit-read-only t))
;; `mu4e--main-view' is called from `mu4e--start', so don't call it a
;; second time here i.e. do not refresh unless specified explicitly with
;; REFRESH arg.
(when refresh
(mu4e--query-items-refresh 'reset-baseline))
(with-current-buffer buf (with-current-buffer buf
(mu4e--main-redraw-buffer)) (mu4e--main-redraw))
(mu4e-display-buffer buf t))) (mu4e-display-buffer buf t)))
(goto-char (point-min))) (goto-char (point-min)))
@ -381,7 +367,7 @@ instead."
(if smtpmail-queue-mail "queued" "sent directly"))) (if smtpmail-queue-mail "queued" "sent directly")))
(unless (or (eq mu4e-split-view 'single-window) (unless (or (eq mu4e-split-view 'single-window)
(not (buffer-live-p (get-buffer mu4e-main-buffer-name)))) (not (buffer-live-p (get-buffer mu4e-main-buffer-name))))
(mu4e--main-redraw-buffer))) (mu4e--main-redraw)))
(defun mu4e--main-menu () (defun mu4e--main-menu ()
"The mu4e main menu in the mini-buffer." "The mu4e main menu in the mini-buffer."

View File

@ -152,16 +152,17 @@ Otherwise, check requirements, then start mu4e. When successful, invoke
(mu4e--context-autoswitch nil mu4e-context-policy)) (mu4e--context-autoswitch nil mu4e-context-policy))
(setq mu4e-pong-func (setq mu4e-pong-func
(lambda (info) (mu4e--pong-handler info func))) (lambda (info) (mu4e--pong-handler info func)))
;; show some notification?
(when mu4e-notification-support
(add-hook 'mu4e-query-items-updated-hook #'mu4e--notification))
;; modeline support ;; modeline support
(when mu4e-modeline-support (when mu4e-modeline-support
(mu4e--modeline-register #'mu4e--bookmarks-modeline-item 'global) (mu4e--modeline-register #'mu4e--bookmarks-modeline-item 'global)
(mu4e-modeline-mode) (mu4e-modeline-mode)
(add-hook 'mu4e-query-items-updated-hook (add-hook 'mu4e-query-items-updated-hook #'mu4e--modeline-update))
#'mu4e--modeline-update))
(mu4e-modeline-mode (if mu4e-modeline-support 1 -1)) (mu4e-modeline-mode (if mu4e-modeline-support 1 -1))
(when mu4e-notification-support ;; redraw main buffer if there is one.
(add-hook 'mu4e-query-items-updated-hook (add-hook 'mu4e-query-items-updated-hook #'mu4e--main-redraw)
#'mu4e--notification))
(mu4e--server-ping) (mu4e--server-ping)
;; maybe request the list of contacts, automatically refreshed after ;; maybe request the list of contacts, automatically refreshed after
;; reindexing ;; reindexing
@ -173,10 +174,9 @@ Otherwise, check requirements, then start mu4e. When successful, invoke
(cancel-timer mu4e--update-timer) (cancel-timer mu4e--update-timer)
(setq mu4e--update-timer nil)) (setq mu4e--update-timer nil))
(mu4e-clear-caches) (mu4e-clear-caches)
(remove-hook 'mu4e-query-items-updated-hook (remove-hook 'mu4e-query-items-updated-hook #'mu4e--main-redraw)
#'mu4e--modeline-update) (remove-hook 'mu4e-query-items-updated-hook #'mu4e--modeline-update)
(remove-hook 'mu4e-query-items-updated-hook (remove-hook 'mu4e-query-items-updated-hook #'mu4e--notification)
#'mu4e--notification)
(mu4e-kill-update-mail) (mu4e-kill-update-mail)
(mu4e-modeline-mode -1) (mu4e-modeline-mode -1)
(mu4e--server-kill) (mu4e--server-kill)