mu4e-view/headers: remove m-v-in-headers-context
Remove mu4e--view-in-headers context and the functions that use it; instead ensure that the functions (in mu4e-headers) handle any context switching if needed. This allows for removing a lot of mu4e-view-... wrappers for mu4e-headers functions. function aliases are provided for backward compat.
This commit is contained in:
@ -893,6 +893,38 @@ COUNT is the number of messages found."
|
|||||||
;; run-hooks
|
;; run-hooks
|
||||||
(run-hooks 'mu4e-headers-found-hook))
|
(run-hooks 'mu4e-headers-found-hook))
|
||||||
|
|
||||||
|
(defmacro mu4e--in-headers-context (&rest body)
|
||||||
|
"Evaluate BODY in the context of the headers buffer/window.
|
||||||
|
|
||||||
|
If we're already in the headers buffer/window, do nothing.
|
||||||
|
If we're in the message view, temporarily switch."
|
||||||
|
`(progn
|
||||||
|
(let* ((msg (mu4e-message-at-point))
|
||||||
|
(buffer (mu4e-get-headers-buffer))
|
||||||
|
(docid (mu4e-message-field msg :docid)))
|
||||||
|
(unless (and buffer msg docid)
|
||||||
|
(mu4e-error "Action is not possible"))
|
||||||
|
;; make sure to select the window if possible, or jumping won't be
|
||||||
|
;; reflected.
|
||||||
|
(with-selected-window (get-buffer-window buffer)
|
||||||
|
(with-current-buffer buffer
|
||||||
|
(mu4e-thread-unfold-all)
|
||||||
|
(if (or (mu4e~headers-goto-docid docid)
|
||||||
|
;; TODO: Is this the best way to find another
|
||||||
|
;; relevant docid for a view buffer?
|
||||||
|
;;
|
||||||
|
;; If you attach a view buffer to another headers
|
||||||
|
;; buffer that does not contain the current docid
|
||||||
|
;; then `mu4e~headers-goto-docid' returns nil and we
|
||||||
|
;; get an error. This "hack" instead gets its
|
||||||
|
;; now-changed headers buffer's current message as a
|
||||||
|
;; docid
|
||||||
|
(mu4e~headers-goto-docid
|
||||||
|
(with-current-buffer buffer
|
||||||
|
(mu4e-message-field (mu4e-message-at-point) :docid))))
|
||||||
|
(progn ,@body)
|
||||||
|
(mu4e-error "Cannot find message in headers buffer")))))))
|
||||||
|
|
||||||
;;; Marking
|
;;; Marking
|
||||||
|
|
||||||
(defmacro mu4e~headers-defun-mark-for (mark)
|
(defmacro mu4e~headers-defun-mark-for (mark)
|
||||||
@ -1331,38 +1363,40 @@ That is, some markpair (move, delete etc.), a field to match and
|
|||||||
a regular expression to match with. Then, mark all matching
|
a regular expression to match with. Then, mark all matching
|
||||||
messages with that mark."
|
messages with that mark."
|
||||||
(interactive)
|
(interactive)
|
||||||
(let ((markpair (mu4e--mark-get-markpair "Mark matched messages with: " t))
|
(mu4e--in-headers-context
|
||||||
(field (mu4e-read-option "Field to match: "
|
(let ((markpair (mu4e--mark-get-markpair "Mark matched messages with: " t))
|
||||||
'( ("subject" . :subject)
|
(field (mu4e-read-option "Field to match: "
|
||||||
("from" . :from)
|
'( ("subject" . :subject)
|
||||||
("to" . :to)
|
("from" . :from)
|
||||||
("cc" . :cc)
|
("to" . :to)
|
||||||
("bcc" . :bcc)
|
("cc" . :cc)
|
||||||
("list" . :list))))
|
("bcc" . :bcc)
|
||||||
(pattern (read-string
|
("list" . :list))))
|
||||||
(mu4e-format "Regexp:")
|
(pattern (read-string
|
||||||
nil 'mu4e~headers-regexp-hist)))
|
(mu4e-format "Regexp:")
|
||||||
(mu4e-headers-mark-for-each-if
|
nil 'mu4e~headers-regexp-hist)))
|
||||||
markpair
|
(mu4e-headers-mark-for-each-if
|
||||||
(lambda (msg _param)
|
markpair
|
||||||
(let* ((value (mu4e-msg-field msg field)))
|
(lambda (msg _param)
|
||||||
(if (member field '(:to :from :cc :bcc :reply-to))
|
(let* ((value (mu4e-msg-field msg field)))
|
||||||
(cl-find-if (lambda (contact)
|
(if (member field '(:to :from :cc :bcc :reply-to))
|
||||||
(let ((name (mu4e-contact-name contact))
|
(cl-find-if (lambda (contact)
|
||||||
(email (mu4e-contact-email contact)))
|
(let ((name (mu4e-contact-name contact))
|
||||||
(or (and name (string-match pattern name))
|
(email (mu4e-contact-email contact)))
|
||||||
(and email (string-match pattern email)))))
|
(or (and name (string-match pattern name))
|
||||||
value)
|
(and email (string-match pattern email)))))
|
||||||
(string-match pattern (or value ""))))))))
|
value)
|
||||||
|
(string-match pattern (or value "")))))))))
|
||||||
|
|
||||||
(defun mu4e-headers-mark-custom ()
|
(defun mu4e-headers-mark-custom ()
|
||||||
"Mark messages based on a user-provided predicate function."
|
"Mark messages based on a user-provided predicate function."
|
||||||
(interactive)
|
(interactive)
|
||||||
(let* ((pred (mu4e-read-option "Match function: "
|
(mu4e--in-headers-context
|
||||||
mu4e-headers-custom-markers))
|
(let* ((pred (mu4e-read-option "Match function: "
|
||||||
(param (when (cdr pred) (eval (cdr pred))))
|
mu4e-headers-custom-markers))
|
||||||
(markpair (mu4e--mark-get-markpair "Mark matched messages with: " t)))
|
(param (when (cdr pred) (eval (cdr pred))))
|
||||||
(mu4e-headers-mark-for-each-if markpair (car pred) param)))
|
(markpair (mu4e--mark-get-markpair "Mark matched messages with: " t)))
|
||||||
|
(mu4e-headers-mark-for-each-if markpair (car pred) param))))
|
||||||
|
|
||||||
(defun mu4e~headers-get-thread-info (msg what)
|
(defun mu4e~headers-get-thread-info (msg what)
|
||||||
"Get WHAT (a symbol, either path or thread-id) for MSG."
|
"Get WHAT (a symbol, either path or thread-id) for MSG."
|
||||||
@ -1426,14 +1460,16 @@ If SUBTHREAD is non-nil, only apply to subthread."
|
|||||||
(mu4e--mark-get-markpair
|
(mu4e--mark-get-markpair
|
||||||
(if subthread "Mark subthread with: " "Mark whole thread with: ")
|
(if subthread "Mark subthread with: " "Mark whole thread with: ")
|
||||||
t))))
|
t))))
|
||||||
(mu4e-headers-mark-thread-using-markpair markpair subthread))
|
(mu4e--in-headers-context
|
||||||
|
(mu4e-headers-mark-thread-using-markpair markpair subthread)))
|
||||||
|
|
||||||
(defun mu4e-headers-mark-subthread (&optional markpair)
|
(defun mu4e-headers-mark-subthread (&optional markpair)
|
||||||
"Like `mu4e-mark-thread' with MARKPAIR, but only for a sub-thread."
|
"Like `mu4e-mark-thread' with MARKPAIR, but only for a sub-thread."
|
||||||
(interactive)
|
(interactive)
|
||||||
(if markpair (mu4e-headers-mark-thread t markpair)
|
(mu4e--in-headers-context
|
||||||
(let ((current-prefix-arg t))
|
(if markpair (mu4e-headers-mark-thread t markpair)
|
||||||
(call-interactively 'mu4e-headers-mark-thread))))
|
(let ((current-prefix-arg t))
|
||||||
|
(call-interactively 'mu4e-headers-mark-thread)))))
|
||||||
|
|
||||||
(defun mu4e-headers-view-message ()
|
(defun mu4e-headers-view-message ()
|
||||||
"View message at point."
|
"View message at point."
|
||||||
@ -1470,37 +1506,38 @@ return nil.
|
|||||||
If pointing at a message after the move and there is a
|
If pointing at a message after the move and there is a
|
||||||
view-window, open the message unless
|
view-window, open the message unless
|
||||||
`mu4e-headers-open-after-move' is non-nil."
|
`mu4e-headers-open-after-move' is non-nil."
|
||||||
(cl-assert (eq major-mode 'mu4e-headers-mode))
|
(mu4e--in-headers-context
|
||||||
(when (ignore-errors
|
(cl-assert (eq major-mode 'mu4e-headers-mode))
|
||||||
(let (line-move-visual)
|
(when (ignore-errors
|
||||||
(line-move lines)
|
(let (line-move-visual)
|
||||||
t))
|
(line-move lines)
|
||||||
(let* ((docid (mu4e~headers-docid-at-point))
|
t))
|
||||||
(folded (and docid (mu4e-thread-message-folded-p))))
|
(let* ((docid (mu4e~headers-docid-at-point))
|
||||||
(if folded
|
(folded (and docid (mu4e-thread-message-folded-p))))
|
||||||
(mu4e~headers-move (if (< lines 0) -1 1)) ;; skip folded
|
(if folded
|
||||||
(when docid
|
(mu4e~headers-move (if (< lines 0) -1 1)) ;; skip folded
|
||||||
;; Skip invisible text at BOL possibly hidden by
|
(when docid
|
||||||
;; the end of another invisible overlay covering
|
;; Skip invisible text at BOL possibly hidden by
|
||||||
;; previous EOL.
|
;; the end of another invisible overlay covering
|
||||||
(move-to-column 2)
|
;; previous EOL.
|
||||||
;; update all windows showing the headers buffer
|
(move-to-column 2)
|
||||||
(walk-windows
|
;; update all windows showing the headers buffer
|
||||||
(lambda (win)
|
(walk-windows
|
||||||
(when (eq (window-buffer win)
|
(lambda (win)
|
||||||
(mu4e-get-headers-buffer (buffer-name)))
|
(when (eq (window-buffer win)
|
||||||
(set-window-point win (point))))
|
(mu4e-get-headers-buffer (buffer-name)))
|
||||||
nil t)
|
(set-window-point win (point))))
|
||||||
;; If the assigned (and buffer-local) `mu4e~headers-view-win'
|
nil t)
|
||||||
;; is not live then that is indicates the user does not want
|
;; If the assigned (and buffer-local) `mu4e~headers-view-win'
|
||||||
;; to pop up the view when they navigate in the headers
|
;; is not live then that is indicates the user does not want
|
||||||
;; buffer.
|
;; to pop up the view when they navigate in the headers
|
||||||
(when (and mu4e-headers-open-after-move
|
;; buffer.
|
||||||
(window-live-p mu4e~headers-view-win))
|
(when (and mu4e-headers-open-after-move
|
||||||
(mu4e-headers-view-message))
|
(window-live-p mu4e~headers-view-win))
|
||||||
;; attempt to highlight the new line, display the message
|
(mu4e-headers-view-message))
|
||||||
(mu4e~headers-highlight docid)
|
;; attempt to highlight the new line, display the message
|
||||||
docid)))))
|
(mu4e~headers-highlight docid)
|
||||||
|
docid))))))
|
||||||
|
|
||||||
(defun mu4e-headers-next (&optional n)
|
(defun mu4e-headers-next (&optional n)
|
||||||
"Move point to the next message header.
|
"Move point to the next message header.
|
||||||
@ -1530,13 +1567,14 @@ view-window, open the message unless
|
|||||||
"Move point to next message that is unread/untrashed.
|
"Move point to next message that is unread/untrashed.
|
||||||
If BACKWARDS is non-nil, move backwards."
|
If BACKWARDS is non-nil, move backwards."
|
||||||
(interactive "P")
|
(interactive "P")
|
||||||
(or (mu4e-headers-find-if-next
|
(mu4e--in-headers-context
|
||||||
(lambda (msg)
|
(or (mu4e-headers-find-if-next
|
||||||
(let ((flags (mu4e-message-field msg :flags)))
|
(lambda (msg)
|
||||||
(and (member 'unread flags) (not (member 'trashed flags)))))
|
(let ((flags (mu4e-message-field msg :flags)))
|
||||||
backwards)
|
(and (member 'unread flags) (not (member 'trashed flags)))))
|
||||||
(mu4e-message (format "No %s unread message found"
|
backwards)
|
||||||
(if backwards "previous" "next")))))
|
(mu4e-message (format "No %s unread message found"
|
||||||
|
(if backwards "previous" "next"))))))
|
||||||
|
|
||||||
(defun mu4e-headers-prev-unread ()
|
(defun mu4e-headers-prev-unread ()
|
||||||
"Move point to previous unread/untrashed message."
|
"Move point to previous unread/untrashed message."
|
||||||
@ -1558,11 +1596,27 @@ If MSG is nil, use message at point."
|
|||||||
(root (plist-get meta :root)))
|
(root (plist-get meta :root)))
|
||||||
(or root (and orphan first-child)))))
|
(or root (and orphan first-child)))))
|
||||||
|
|
||||||
|
|
||||||
|
(defun mu4e-headers-thread-goto-root ()
|
||||||
|
"Move to thread root."
|
||||||
|
(interactive)
|
||||||
|
(mu4e--in-headers-context (mu4e-thread-goto-root)))
|
||||||
|
|
||||||
|
(defun mu4e-headers-thread-fold-toggle-goto-next ()
|
||||||
|
"Toggle threading or go to next."
|
||||||
|
(interactive)
|
||||||
|
(mu4e--in-headers-context (mu4e-thread-fold-toggle-goto-next)))
|
||||||
|
|
||||||
|
(defun mu4e-headers-thread-fold-toggle-all ()
|
||||||
|
"Toggle all threads."
|
||||||
|
(interactive)
|
||||||
|
(mu4e--in-headers-context (mu4e-thread-fold-toggle-all)))
|
||||||
|
|
||||||
(defun mu4e~headers-prev-or-next-thread (backwards)
|
(defun mu4e~headers-prev-or-next-thread (backwards)
|
||||||
"Move point to the top of the next thread.
|
"Move point to the top of the next thread.
|
||||||
If BACKWARDS is non-nil, move backwards."
|
If BACKWARDS is non-nil, move backwards."
|
||||||
(when (mu4e-headers-find-if-next #'mu4e~headers-thread-root-p backwards)
|
(when (mu4e-headers-find-if-next #'mu4e~headers-thread-root-p backwards)
|
||||||
(point)))
|
(point)))
|
||||||
|
|
||||||
(defun mu4e-headers-prev-thread ()
|
(defun mu4e-headers-prev-thread ()
|
||||||
"Move point to the previous thread."
|
"Move point to the previous thread."
|
||||||
@ -1616,10 +1670,11 @@ argument."
|
|||||||
"Set MARK on the message at point or in region.
|
"Set MARK on the message at point or in region.
|
||||||
Then, move to the next message."
|
Then, move to the next message."
|
||||||
(interactive)
|
(interactive)
|
||||||
(when (mu4e-thread-message-folded-p)
|
(mu4e--in-headers-context
|
||||||
(mu4e-warn "Cannot mark folded messages"))
|
(when (mu4e-thread-message-folded-p)
|
||||||
(mu4e-mark-set mark)
|
(mu4e-warn "Cannot mark folded messages"))
|
||||||
(when mu4e-headers-advance-after-mark (mu4e-headers-next)))
|
(mu4e-mark-set mark)
|
||||||
|
(when mu4e-headers-advance-after-mark (mu4e-headers-next))))
|
||||||
|
|
||||||
(defun mu4e~headers-quit-buffer ()
|
(defun mu4e~headers-quit-buffer ()
|
||||||
"Quit the mu4e-headers buffer and go back to the main view."
|
"Quit the mu4e-headers buffer and go back to the main view."
|
||||||
|
|||||||
@ -76,6 +76,44 @@
|
|||||||
(make-obsolete-variable 'mu4e-view-prefer-html "No longer in use" "1.7.0")
|
(make-obsolete-variable 'mu4e-view-prefer-html "No longer in use" "1.7.0")
|
||||||
(make-obsolete-variable 'mu4e-view-html-plaintext-ratio-heuristic
|
(make-obsolete-variable 'mu4e-view-html-plaintext-ratio-heuristic
|
||||||
"No longer in use" "1.7.0")
|
"No longer in use" "1.7.0")
|
||||||
|
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-headers-next 'mu4e-headers-next "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-headers-prev 'mu4e-headers-prev "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-pattern 'mu4e-headers-mark-pattern "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-unmark 'mu4e-mark-unmark-all "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-unmark-all 'mu4e-mark-unmark-all "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-search-narrow 'mu4e-search-narrow "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-search-edit 'mu4e-search-edit "1.14.0")
|
||||||
|
|
||||||
|
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-search-edit 'mu4e-search-edit "1.14.0")
|
||||||
|
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-move 'mu4e-headers-mark-for-move "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-refile 'mu4e-headers-mark-for-refile "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-delete 'mu4e-headers-mark-for-delete "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-flag 'mu4e-headers-mark-for-flag "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-unflag 'mu4e-headers-mark-for-unflag "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-unmark 'mu4e-headers-mark-for-unmark "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-something 'mu4e-headers-mark-for-something "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-read 'mu4e-headers-mark-for-read "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-unread 'mu4e-headers-mark-for-unread "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-trash 'mu4e-headers-mark-for-trash "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-untrash 'mu4e-headers-mark-for-untrash "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-label 'mu4e-headers-mark-for-label "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-for-unlabel 'mu4e-headers-mark-for-unlabel "1.14.0")
|
||||||
|
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-custom 'mu4e-headers-mark-custom "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-unmark 'mu4e-headers-mark-for-unmark "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-marked-execute 'mu4e-mark-execute-all "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-thread 'mu4e-headers-mark-thread "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-mark-subthread 'mu4e-headers-mark-subthread "1.14.0")
|
||||||
|
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-thread-goto-root 'mu4e-headers-thread-goto-root "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-thread-fold-toggle-goto-next
|
||||||
|
'mu4e-headers-thread-fold-toggle-goto-next "1.14.0")
|
||||||
|
(define-obsolete-function-alias 'mu4e-view-thread-fold-toggle-goto-prev
|
||||||
|
'mu4e-headers-thread-fold-toggle-goto-prev "1.14.0")
|
||||||
|
|
||||||
(make-obsolete-variable 'mu4e-message-body-rewrite-functions
|
(make-obsolete-variable 'mu4e-message-body-rewrite-functions
|
||||||
"No longer in use" "1.7.0")
|
"No longer in use" "1.7.0")
|
||||||
;;; Html2Text
|
;;; Html2Text
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
;;; mu4e-view.el --- Mode for viewing e-mail messages -*- lexical-binding: t -*-
|
;;; mu4e-view.el --- Mode for viewing e-mail messages -*- lexical-binding: t -*-
|
||||||
|
|
||||||
;; Copyright (C) 2021-2025 Dirk-Jan C. Binnema
|
;; Copyright (C) 2021-2026 Dirk-Jan C. Binnema
|
||||||
|
|
||||||
;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||||
;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||||
@ -120,71 +120,11 @@ Then, display the results."
|
|||||||
(let ((path (mu4e-message-readable-path)))
|
(let ((path (mu4e-message-readable-path)))
|
||||||
(mu4e-process-file-through-pipe path cmd)))
|
(mu4e-process-file-through-pipe path cmd)))
|
||||||
|
|
||||||
(defmacro mu4e--view-in-headers-context (&rest body)
|
|
||||||
"Evaluate BODY in the context of the headers buffer."
|
|
||||||
`(progn
|
|
||||||
(let* ((msg (mu4e-message-at-point))
|
|
||||||
(buffer (cond
|
|
||||||
;; are we already inside a headers buffer?
|
|
||||||
((mu4e-current-buffer-type-p 'headers) (current-buffer))
|
|
||||||
;; if not, are we inside a view buffer, and does
|
|
||||||
;; it have linked headers buffer?
|
|
||||||
((mu4e-current-buffer-type-p 'view)
|
|
||||||
(when (mu4e--view-detached-p (current-buffer))
|
|
||||||
(mu4e-error
|
|
||||||
"Cannot navigate in a detached view buffer"))
|
|
||||||
(mu4e-get-headers-buffer))
|
|
||||||
;; fallback; but what would trigger this?
|
|
||||||
(t (mu4e-get-headers-buffer))))
|
|
||||||
(docid (mu4e-message-field msg :docid)))
|
|
||||||
(unless docid
|
|
||||||
(mu4e-error "Message without docid: action is not possible"))
|
|
||||||
|
|
||||||
;; make sure to select the window if possible, or jumping won't be
|
|
||||||
;; reflected.
|
|
||||||
(with-selected-window (or (get-buffer-window buffer)
|
|
||||||
(get-buffer-window))
|
|
||||||
(with-current-buffer buffer
|
|
||||||
(mu4e-thread-unfold-all)
|
|
||||||
(if (or (mu4e~headers-goto-docid docid)
|
|
||||||
;; TODO: Is this the best way to find another
|
|
||||||
;; relevant docid for a view buffer?
|
|
||||||
;;
|
|
||||||
;; If you attach a view buffer to another headers
|
|
||||||
;; buffer that does not contain the current docid
|
|
||||||
;; then `mu4e~headers-goto-docid' returns nil and we
|
|
||||||
;; get an error. This "hack" instead gets its
|
|
||||||
;; now-changed headers buffer's current message as a
|
|
||||||
;; docid
|
|
||||||
(mu4e~headers-goto-docid
|
|
||||||
(with-current-buffer buffer
|
|
||||||
(mu4e-message-field (mu4e-message-at-point) :docid))))
|
|
||||||
,@body
|
|
||||||
(mu4e-error "Cannot find message in headers buffer")))))))
|
|
||||||
|
|
||||||
(defun mu4e-view-headers-next (&optional n)
|
|
||||||
"Move point to the next message header.
|
|
||||||
If this succeeds, return the new docid. Otherwise, return nil.
|
|
||||||
Optionally, takes an integer N (prefix argument), to the Nth next
|
|
||||||
header."
|
|
||||||
(interactive "P")
|
|
||||||
(mu4e--view-in-headers-context
|
|
||||||
(mu4e~headers-move (or n 1))))
|
|
||||||
|
|
||||||
(defun mu4e-view-headers-prev (&optional n)
|
|
||||||
"Move point to the previous message header.
|
|
||||||
If this succeeds, return the new docid. Otherwise, return nil.
|
|
||||||
Optionally, takes an integer N (prefix argument), to the Nth
|
|
||||||
previous header."
|
|
||||||
(interactive "P")
|
|
||||||
(mu4e--view-in-headers-context
|
|
||||||
(mu4e~headers-move (- (or n 1)))))
|
|
||||||
|
|
||||||
(defun mu4e--view-prev-or-next (func backwards)
|
(defun mu4e--view-prev-or-next (func backwards)
|
||||||
"Move point to the next or previous message and invoke FUNC.
|
"Move point to the next or previous message and invoke FUNC.
|
||||||
Go to the previous message if BACKWARDS is non-nil. If this
|
Go to the previous message if BACKWARDS is non-nil. If this
|
||||||
succeeds, return the new docid. Otherwise, return nil."
|
succeeds, return the new docid. Otherwise, return nil."
|
||||||
(mu4e--view-in-headers-context (funcall func backwards))
|
(funcall func backwards)
|
||||||
(mu4e-select-other-view)
|
(mu4e-select-other-view)
|
||||||
(mu4e-headers-view-message))
|
(mu4e-headers-view-message))
|
||||||
|
|
||||||
@ -212,21 +152,6 @@ If this succeeds, return the new docid. Otherwise, return nil."
|
|||||||
(interactive)
|
(interactive)
|
||||||
(mu4e--view-prev-or-next #'mu4e~headers-prev-or-next-thread nil))
|
(mu4e--view-prev-or-next #'mu4e~headers-prev-or-next-thread nil))
|
||||||
|
|
||||||
(defun mu4e-view-thread-goto-root ()
|
|
||||||
"Move to thread root."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context (mu4e-thread-goto-root)))
|
|
||||||
|
|
||||||
(defun mu4e-view-thread-fold-toggle-goto-next ()
|
|
||||||
"Toggle threading or go to next."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context (mu4e-thread-fold-toggle-goto-next)))
|
|
||||||
|
|
||||||
(defun mu4e-view-thread-fold-toggle-all ()
|
|
||||||
"Toggle all threads."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context (mu4e-thread-fold-toggle-all)))
|
|
||||||
|
|
||||||
;;; Interactive functions
|
;;; Interactive functions
|
||||||
(defun mu4e-view-action (&optional msg)
|
(defun mu4e-view-action (&optional msg)
|
||||||
"Ask user for some action to apply on MSG, then do it.
|
"Ask user for some action to apply on MSG, then do it.
|
||||||
@ -239,46 +164,6 @@ If MSG is nil apply action to message returned by
|
|||||||
(actionfunc (mu4e-read-option "Action: " mu4e-view-actions)))
|
(actionfunc (mu4e-read-option "Action: " mu4e-view-actions)))
|
||||||
(funcall actionfunc msg)))
|
(funcall actionfunc msg)))
|
||||||
|
|
||||||
(defun mu4e-view-mark-pattern ()
|
|
||||||
"Mark messages that match a certain pattern.
|
|
||||||
Ask user for a kind of mark, (move, delete etc.), a field to
|
|
||||||
match and a regular expression to match with. Then, mark all
|
|
||||||
matching messages with that mark."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context (mu4e-headers-mark-pattern)))
|
|
||||||
|
|
||||||
(defun mu4e-view-mark-thread (&optional markpair)
|
|
||||||
"Mark whole thread with a certain mark.
|
|
||||||
Ask user for a kind of mark (move, delete etc.), and apply it
|
|
||||||
to all messages in the thread at point in the headers view. The
|
|
||||||
optional MARKPAIR can also be used to provide the mark
|
|
||||||
selection."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context
|
|
||||||
(if markpair (mu4e-headers-mark-thread nil markpair)
|
|
||||||
(call-interactively 'mu4e-headers-mark-thread))))
|
|
||||||
|
|
||||||
(defun mu4e-view-mark-subthread (&optional markpair)
|
|
||||||
"Mark subthread with a certain mark.
|
|
||||||
Ask user for a kind of mark (move, delete etc.), and apply it
|
|
||||||
to all messages in the subthread at point in the headers view.
|
|
||||||
The optional MARKPAIR can also be used to provide the mark
|
|
||||||
selection."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context
|
|
||||||
(if markpair (mu4e-headers-mark-subthread markpair)
|
|
||||||
(mu4e-headers-mark-subthread))))
|
|
||||||
|
|
||||||
(defun mu4e-view-search-narrow ()
|
|
||||||
"Run `mu4e-headers-search-narrow' in the headers buffer."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context (mu4e-search-narrow)))
|
|
||||||
|
|
||||||
(defun mu4e-view-search-edit ()
|
|
||||||
"Run `mu4e-search-edit' in the headers buffer."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context (mu4e-search-edit)))
|
|
||||||
|
|
||||||
(defun mu4e-mark-region-code ()
|
(defun mu4e-mark-region-code ()
|
||||||
"Highlight region marked with `message-mark-inserted-region'.
|
"Highlight region marked with `message-mark-inserted-region'.
|
||||||
Add this function to `mu4e-view-mode-hook' to enable this feature."
|
Add this function to `mu4e-view-mode-hook' to enable this feature."
|
||||||
@ -308,17 +193,10 @@ Add this function to `mu4e-view-mode-hook' to enable this feature."
|
|||||||
(setq beg nil end nil))))))
|
(setq beg nil end nil))))))
|
||||||
|
|
||||||
;;; View Utilities
|
;;; View Utilities
|
||||||
|
|
||||||
(defun mu4e-view-mark-custom ()
|
|
||||||
"Run some custom mark function."
|
|
||||||
(mu4e--view-in-headers-context
|
|
||||||
(mu4e-headers-mark-custom)))
|
|
||||||
|
|
||||||
(defun mu4e--view-split-view-p ()
|
(defun mu4e--view-split-view-p ()
|
||||||
"Return t if we're in split-view, nil otherwise."
|
"Return t if we're in split-view, nil otherwise."
|
||||||
(member mu4e-split-view '(horizontal vertical)))
|
(member mu4e-split-view '(horizontal vertical)))
|
||||||
|
|
||||||
|
|
||||||
(defun mu4e-view-detach ()
|
(defun mu4e-view-detach ()
|
||||||
"Detach the view buffer from its headers buffer."
|
"Detach the view buffer from its headers buffer."
|
||||||
(interactive)
|
(interactive)
|
||||||
@ -369,64 +247,6 @@ any further, go the next message."
|
|||||||
(interactive)
|
(interactive)
|
||||||
(scroll-down 1))
|
(scroll-down 1))
|
||||||
|
|
||||||
;;; Mark commands
|
|
||||||
|
|
||||||
(defun mu4e-view-unmark-all ()
|
|
||||||
"If we're in split-view, unmark all messages.
|
|
||||||
Otherwise, warn user that unmarking only works in the header
|
|
||||||
list."
|
|
||||||
(interactive)
|
|
||||||
(if (mu4e--view-split-view-p)
|
|
||||||
(mu4e--view-in-headers-context (mu4e-mark-unmark-all))
|
|
||||||
(mu4e-message "Unmarking needs to be done in the header list view")))
|
|
||||||
|
|
||||||
(defun mu4e-view-unmark ()
|
|
||||||
"If we're in split-view, unmark message at point.
|
|
||||||
Otherwise, warn user that unmarking only works in the header
|
|
||||||
list."
|
|
||||||
(interactive)
|
|
||||||
(if (mu4e--view-split-view-p)
|
|
||||||
(mu4e-view-mark-for-unmark)
|
|
||||||
(mu4e-message "Unmarking needs to be done in the header list view")))
|
|
||||||
|
|
||||||
(defun mu4e-view-mark-and-next (mark)
|
|
||||||
"Set MARK on the current message.
|
|
||||||
Then, move to the next message."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context
|
|
||||||
(mu4e-headers-mark-and-next mark)))
|
|
||||||
|
|
||||||
(defmacro mu4e--view-defun-mark-for (mark)
|
|
||||||
"Define a function mu4e-view-mark-for- MARK."
|
|
||||||
(let ((funcname (intern (format "mu4e-view-mark-for-%s" mark)))
|
|
||||||
(docstring (format "Mark the current message for %s." mark)))
|
|
||||||
`(progn
|
|
||||||
(defun ,funcname () ,docstring
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context
|
|
||||||
(mu4e-headers-mark-and-next ',mark)))
|
|
||||||
(put ',funcname 'definition-name ',mark))))
|
|
||||||
|
|
||||||
(mu4e--view-defun-mark-for move)
|
|
||||||
(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 something)
|
|
||||||
(mu4e--view-defun-mark-for read)
|
|
||||||
(mu4e--view-defun-mark-for unread)
|
|
||||||
(mu4e--view-defun-mark-for trash)
|
|
||||||
(mu4e--view-defun-mark-for untrash)
|
|
||||||
(mu4e--view-defun-mark-for label)
|
|
||||||
(mu4e--view-defun-mark-for unlabel)
|
|
||||||
|
|
||||||
(defun mu4e-view-marked-execute ()
|
|
||||||
"Execute the marked actions."
|
|
||||||
(interactive)
|
|
||||||
(mu4e--view-in-headers-context
|
|
||||||
(mu4e-mark-execute-all)))
|
|
||||||
|
|
||||||
;;; URL handling
|
;;; URL handling
|
||||||
|
|
||||||
(defvar mu4e--view-link-map nil
|
(defvar mu4e--view-link-map nil
|
||||||
@ -958,9 +778,9 @@ This is useful for advising some Gnus-functionality that does not work in mu4e."
|
|||||||
(define-key map "z" #'mu4e-view-detach)
|
(define-key map "z" #'mu4e-view-detach)
|
||||||
(define-key map "Z" #'mu4e-view-attach)
|
(define-key map "Z" #'mu4e-view-attach)
|
||||||
|
|
||||||
(define-key map "%" #'mu4e-view-mark-pattern)
|
(define-key map "%" #'mu4e-headers-mark-pattern)
|
||||||
(define-key map "t" #'mu4e-view-mark-subthread)
|
(define-key map "t" #'mu4e-headers-mark-subthread)
|
||||||
(define-key map "T" #'mu4e-view-mark-thread)
|
(define-key map "T" #'mu4e-headers-mark-thread)
|
||||||
|
|
||||||
(define-key map "g" #'mu4e-view-go-to-url)
|
(define-key map "g" #'mu4e-view-go-to-url)
|
||||||
(define-key map "k" #'mu4e-view-save-url)
|
(define-key map "k" #'mu4e-view-save-url)
|
||||||
@ -987,51 +807,43 @@ This is useful for advising some Gnus-functionality that does not work in mu4e."
|
|||||||
(define-key map (kbd "<backspace>") #'mu4e-scroll-down)
|
(define-key map (kbd "<backspace>") #'mu4e-scroll-down)
|
||||||
|
|
||||||
;; navigation between messages
|
;; navigation between messages
|
||||||
(define-key map "p" #'mu4e-view-headers-prev)
|
(define-key map "p" #'mu4e-headers-prev)
|
||||||
(define-key map "n" #'mu4e-view-headers-next)
|
(define-key map "n" #'mu4e-headers-next)
|
||||||
;; the same
|
;; the same
|
||||||
(define-key map (kbd "<M-down>") #'mu4e-view-headers-next)
|
(define-key map (kbd "<M-down>") #'mu4e-headers-next)
|
||||||
(define-key map (kbd "<M-up>") #'mu4e-view-headers-prev)
|
(define-key map (kbd "<M-up>") #'mu4e-headers-prev)
|
||||||
|
|
||||||
(define-key map (kbd "[") #'mu4e-view-headers-prev-unread)
|
(define-key map (kbd "[") #'mu4e-view-headers-prev-unread)
|
||||||
(define-key map (kbd "]") #'mu4e-view-headers-next-unread)
|
(define-key map (kbd "]") #'mu4e-view-headers-next-unread)
|
||||||
(define-key map (kbd "{") #'mu4e-view-headers-prev-thread)
|
(define-key map (kbd "{") #'mu4e-view-headers-prev-thread)
|
||||||
(define-key map (kbd "}") #'mu4e-view-headers-next-thread)
|
(define-key map (kbd "}") #'mu4e-view-headers-next-thread)
|
||||||
|
|
||||||
;; ;; threads
|
|
||||||
;; TODO: find some binding that don't conflict
|
|
||||||
;; (define-key map (kbd "<S-left>") #'mu4e-view-thread-goto-root)
|
|
||||||
;; ;; <tab> is taken already
|
|
||||||
;; (define-key map (kbd "<C-S-tab>") #'mu4e-view-thread-fold-toggle-goto-next)
|
|
||||||
;; (define-key map (kbd "<backtab>") #'mu4e-view-thread-fold-toggle-all)
|
|
||||||
|
|
||||||
|
|
||||||
;; switching from view <-> headers (when visible)
|
;; switching from view <-> headers (when visible)
|
||||||
(define-key map "y" #'mu4e-select-other-view)
|
(define-key map "y" #'mu4e-select-other-view)
|
||||||
|
|
||||||
;; marking/unmarking
|
;; marking/unmarking
|
||||||
(define-key map "d" #'mu4e-view-mark-for-trash)
|
(define-key map "d" #'mu4e-headers-mark-for-trash)
|
||||||
(define-key map (kbd "<delete>") #'mu4e-view-mark-for-delete)
|
(define-key map (kbd "<delete>") #'mu4e-headers-mark-for-delete)
|
||||||
(define-key map (kbd "<deletechar>") #'mu4e-view-mark-for-delete)
|
(define-key map (kbd "<deletechar>") #'mu4e-headers-mark-for-delete)
|
||||||
(define-key map (kbd "D") #'mu4e-view-mark-for-delete)
|
(define-key map (kbd "D") #'mu4e-headers-mark-for-delete)
|
||||||
(define-key map (kbd "m") #'mu4e-view-mark-for-move)
|
(define-key map (kbd "m") #'mu4e-headers-mark-for-move)
|
||||||
(define-key map (kbd "r") #'mu4e-view-mark-for-refile)
|
(define-key map (kbd "r") #'mu4e-headers-mark-for-refile)
|
||||||
|
|
||||||
(define-key map (kbd "?") #'mu4e-view-mark-for-unread)
|
(define-key map (kbd "?") #'mu4e-headers-mark-for-unread)
|
||||||
(define-key map (kbd "!") #'mu4e-view-mark-for-read)
|
(define-key map (kbd "!") #'mu4e-headers-mark-for-read)
|
||||||
|
|
||||||
(define-key map (kbd "+") #'mu4e-view-mark-for-flag)
|
(define-key map (kbd "+") #'mu4e-headers-mark-for-flag)
|
||||||
(define-key map (kbd "-") #'mu4e-view-mark-for-unflag)
|
(define-key map (kbd "-") #'mu4e-headers-mark-for-unflag)
|
||||||
(define-key map (kbd "=") #'mu4e-view-mark-for-untrash)
|
(define-key map (kbd "=") #'mu4e-headers-mark-for-untrash)
|
||||||
(define-key map (kbd "&") #'mu4e-view-mark-custom)
|
(define-key map (kbd "&") #'mu4e-headers-mark-custom)
|
||||||
|
|
||||||
(define-key map (kbd "l") #'mu4e-view-mark-for-label)
|
(define-key map (kbd "l") #'mu4e-headers-mark-for-label)
|
||||||
(define-key map (kbd "L") #'mu4e-view-mark-for-unlabel)
|
(define-key map (kbd "L") #'mu4e-headers-mark-for-unlabel)
|
||||||
|
|
||||||
(define-key map (kbd "*") #'mu4e-view-mark-for-something)
|
(define-key map (kbd "*") #'mu4e-headers-mark-for-something)
|
||||||
(define-key map (kbd "<kp-multiply>") #'mu4e-view-mark-for-something)
|
(define-key map (kbd "<kp-multiply>") #'mu4e-headers-mark-for-something)
|
||||||
(define-key map (kbd "<insert>") #'mu4e-view-mark-for-something)
|
(define-key map (kbd "<insert>") #'mu4e-headers-mark-for-something)
|
||||||
(define-key map (kbd "<insertchar>") #'mu4e-view-mark-for-something)
|
(define-key map (kbd "<insertchar>") #'mu4e-headers-mark-for-something)
|
||||||
|
|
||||||
(define-key map ";" #'mu4e-context-switch)
|
(define-key map ";" #'mu4e-context-switch)
|
||||||
|
|
||||||
@ -1046,9 +858,9 @@ This is useful for advising some Gnus-functionality that does not work in mu4e."
|
|||||||
(define-key map "c" #'mu4e-copy-thing-at-point)
|
(define-key map "c" #'mu4e-copy-thing-at-point)
|
||||||
|
|
||||||
;; next 3 only warn user when attempt in the message view
|
;; next 3 only warn user when attempt in the message view
|
||||||
(define-key map "u" #'mu4e-view-unmark)
|
(define-key map "u" #'mu4e-headers-mark-for-unmark)
|
||||||
(define-key map "U" #'mu4e-view-unmark-all)
|
(define-key map "U" #'mu4e-mark-unmark-all)
|
||||||
(define-key map "x" #'mu4e-view-marked-execute)
|
(define-key map "x" #'mu4e-mark-execute-all)
|
||||||
|
|
||||||
(define-key map "$" #'mu4e-show-log)
|
(define-key map "$" #'mu4e-show-log)
|
||||||
(define-key map "H" #'mu4e-display-manual)
|
(define-key map "H" #'mu4e-display-manual)
|
||||||
@ -1074,10 +886,10 @@ This is useful for advising some Gnus-functionality that does not work in mu4e."
|
|||||||
["View raw" mu4e-view-raw-message]
|
["View raw" mu4e-view-raw-message]
|
||||||
["Pipe through shell" mu4e-view-pipe]
|
["Pipe through shell" mu4e-view-pipe]
|
||||||
"--"
|
"--"
|
||||||
["Mark for deletion" mu4e-view-mark-for-delete]
|
["Mark for deletion" mu4e-headers-mark-for-delete]
|
||||||
["Mark for untrash" mu4e-view-mark-for-untrash]
|
["Mark for untrash" mu4e-headers-mark-for-untrash]
|
||||||
["Mark for trash" mu4e-view-mark-for-trash]
|
["Mark for trash" mu4e-headers-mark-for-trash]
|
||||||
["Mark for move" mu4e-view-mark-for-move]
|
["Mark for move" mu4e-headers-mark-for-move]
|
||||||
)
|
)
|
||||||
mu4e--compose-menu-items
|
mu4e--compose-menu-items
|
||||||
mu4e--search-menu-items
|
mu4e--search-menu-items
|
||||||
|
|||||||
Reference in New Issue
Block a user