Merge branch 'wip/djcb/toggle-property'
This commit is contained in:
19
.dir-locals.el
Normal file
19
.dir-locals.el
Normal file
@ -0,0 +1,19 @@
|
||||
;;; Directory Local Variables -*- no-byte-compile: t; -*-
|
||||
;;; For more information see (info "(emacs) Directory Variables")
|
||||
((nil . ((tab-width . 8)
|
||||
(fill-column . 80)
|
||||
;; (commment-fill-column . 80)
|
||||
(emacs-lisp-docstring-fill-column . 65)
|
||||
(bug-reference-url-format . "https://github.com/djcb/mu/issues/%s")))
|
||||
(c-mode . ((c-file-style . "linux")
|
||||
(indent-tabs-mode . t)
|
||||
(mode . bug-reference-prog)))
|
||||
(c++-mode . ((c-file-style . "linux")
|
||||
(fill-column . 100)
|
||||
;; (comment-fill-column . 80)
|
||||
(mode . bug-reference-prog)))
|
||||
(emacs-lisp-mode . ((indent-tabs-mode . nil)
|
||||
(mode . bug-reference-prog)))
|
||||
(lisp-data-mode . ((indent-tabs-mode . nil)))
|
||||
(texinfo-mode . ((mode . bug-reference-prog)))
|
||||
(org-mode . ((mode . bug-reference))))
|
||||
20
NEWS.org
20
NEWS.org
@ -15,13 +15,31 @@
|
||||
there's now 'z' binding (~mu4e-view-detach~), to 'detach' view and alllow
|
||||
for keeping multiple views around; see the Mu4e manual for details.
|
||||
|
||||
- One very visible (experimental) change is that the main-window is no
|
||||
longer full-screen
|
||||
|
||||
- when moving messages (which includes changing flags), file-flags changes
|
||||
are propagated to duplicates of the messages; that is, e.g. the /Seen/ or
|
||||
/Replied/ status is propagated to all duplicates (earlier, this was only
|
||||
done when marking a message as read). Note, /Draft/, /Flagged/ and /Trashed/
|
||||
flags are deliberately *not* propagated.
|
||||
|
||||
- teach ~mu4e-copy-thing-at-point~ about shr links
|
||||
- teach ~mu4e-copy-thing-at-point~ about ~shr~ links
|
||||
|
||||
- The ~mu4e-headers-toggle-setting~ has been renamed
|
||||
~mu4e-headers-toggle-property~ and has the new default binding ~P~, which
|
||||
works in both the headers-view and message-view. The older functions
|
||||
~mu4e-headers-toggle-threading~, ~mu4e-headers-toggle-threading~,
|
||||
~mu4e-headers-toggle-full-search~ ~mu4e-headers-toggle-include-related~,
|
||||
~full-search~skip-duplicates~ have been removed (with their keybindings) in
|
||||
favor of ~mu4e-headers-toggle-property~.
|
||||
|
||||
- There's also a new property ~mu4e-headers-hide-enabled~, which controls
|
||||
wheter ~mu4e-headers-hide-predicate~ is applied (when non-~nil~). This can be
|
||||
used to temporarily turn the predicate off/on.
|
||||
|
||||
- When searching, the number of hidden messages is now shown in the
|
||||
message footer along with the number of Found messages
|
||||
|
||||
- all the obsolete function and variable aliases have been moved to
|
||||
~mu4e-obsolete.el~ so we can unclutter the non-obsolete code a bit.
|
||||
|
||||
@ -32,7 +32,8 @@
|
||||
(require 'fringe)
|
||||
(require 'hl-line)
|
||||
(require 'mailcap)
|
||||
(require 'mule-util) ;; seems _some_ people need this for truncate-string-ellipsis
|
||||
(require 'mule-util) ;; seems _some_ people need this for
|
||||
;; truncate-string-ellipsis
|
||||
|
||||
(require 'mu4e-update)
|
||||
|
||||
@ -129,11 +130,10 @@ next mail after marking a message in header view."
|
||||
|
||||
|
||||
(defvar mu4e-headers-hide-predicate nil
|
||||
"Predicate function to hide matching heasders.
|
||||
If the function evaluates to non-nil when applied a a message
|
||||
plist, do not show the corresponding header. The function takes
|
||||
one parameter MSG, which is the message plist for the message to
|
||||
be hidden or not.
|
||||
"Predicate function to hide matching headers.
|
||||
Either nil or a function taking one message plist parameter and
|
||||
which which return non-nil for messages that should be hidden from
|
||||
the search results. Also see `mu4e-headers-hide-enabled'.
|
||||
|
||||
Example that hides all trashed messages:
|
||||
|
||||
@ -141,8 +141,14 @@ Example that hides all trashed messages:
|
||||
(lambda (msg)
|
||||
(member \='trashed (mu4e-message-field msg :flags)))).")
|
||||
|
||||
(defvar mu4e-headers-hide-enabled t
|
||||
"Whether `mu4e-headers-hide-predicate' should be active.
|
||||
This can be used to toggle use of the predicate through
|
||||
`mu4e-headers-toggle-property'.")
|
||||
|
||||
(defcustom mu4e-headers-visible-flags
|
||||
'(draft flagged new passed replied trashed attach encrypted signed list personal)
|
||||
'(draft flagged new passed replied trashed attach encrypted signed
|
||||
list personal)
|
||||
"An ordered list of flags to show in the headers buffer.
|
||||
Each element is a symbol in the list.
|
||||
|
||||
@ -269,6 +275,9 @@ Must have the same length as `mu4e-headers-thread-connection-prefix'.")
|
||||
"Non-fancy and fancy labels to indicate related search in the mode-line.")
|
||||
(defvar mu4e-headers-skip-duplicates-label '("U" . "Ⓤ") ;; 'U' for 'unique'
|
||||
"Non-fancy and fancy labels for include-related search in the mode-line.")
|
||||
(defvar mu4e-headers-hide-label '("H" . "Ⓗ")
|
||||
"Non-fancy and fancy labels to indicate header-hiding is active in
|
||||
the mode-line.")
|
||||
|
||||
;;;; Various
|
||||
|
||||
@ -333,6 +342,9 @@ In the format needed for `mu4e-read-option'.")
|
||||
"If non-nil, report on the time it took to render the messages.
|
||||
This is mostly useful for profiling.")
|
||||
|
||||
(defvar mu4e~headers-hidden 0
|
||||
"Number of headers hidden due to `mu4e-headers-hide-predicate'.")
|
||||
|
||||
|
||||
|
||||
;;; Clear
|
||||
@ -341,7 +353,8 @@ This is mostly useful for profiling.")
|
||||
"Clear the headers buffer and related data structures.
|
||||
Optionally, show TEXT."
|
||||
(when (buffer-live-p (mu4e-get-headers-buffer))
|
||||
(setq mu4e~headers-render-start (float-time))
|
||||
(setq mu4e~headers-render-start (float-time)
|
||||
mu4e~headers-hidden 0)
|
||||
(let ((inhibit-read-only t))
|
||||
(with-current-buffer (mu4e-get-headers-buffer)
|
||||
(mu4e--mark-clear)
|
||||
@ -374,7 +387,8 @@ into a string."
|
||||
(connection (funcall get-prefix mu4e-headers-thread-connection-prefix))
|
||||
(blank (funcall get-prefix mu4e-headers-thread-blank-prefix))
|
||||
(orphan (funcall get-prefix mu4e-headers-thread-orphan-prefix))
|
||||
(single-orphan (funcall get-prefix mu4e-headers-thread-single-orphan-prefix))
|
||||
(single-orphan (funcall get-prefix
|
||||
mu4e-headers-thread-single-orphan-prefix))
|
||||
(duplicate (funcall get-prefix mu4e-headers-thread-duplicate-prefix))
|
||||
(t "?"))))
|
||||
|
||||
@ -481,7 +495,8 @@ with DOCID which must be present in the headers buffer."
|
||||
(if single-orphan 'single-orphan
|
||||
(if (and orphan
|
||||
(or first-child
|
||||
(not (eq mu4e-headers-thread-mark-as-orphan 'first))))
|
||||
(not (eq mu4e-headers-thread-mark-as-orphan
|
||||
'first))))
|
||||
'orphan
|
||||
(if last-child 'last-child
|
||||
(if first-child 'first-child
|
||||
@ -650,7 +665,10 @@ space propertized with a `display' text property which expands to
|
||||
(let* ((field (car f-w))
|
||||
(width (cdr f-w))
|
||||
(val (mu4e~headers-field-value msg field))
|
||||
(val (and val (if width (mu4e~headers-truncate-field field val width) val))))
|
||||
(val (and val
|
||||
(if width
|
||||
(mu4e~headers-truncate-field field val width)
|
||||
val))))
|
||||
val))
|
||||
|
||||
(defsubst mu4e~headers-apply-flags (msg fieldval)
|
||||
@ -671,15 +689,18 @@ space propertized with a `display' text property which expands to
|
||||
fieldval))
|
||||
|
||||
(defsubst mu4e~message-header-line (msg)
|
||||
"Return a propertized description of MSG suitable for
|
||||
"Return a propertized description of message MSG suitable for
|
||||
displaying in the header view."
|
||||
(unless (and mu4e-headers-hide-predicate
|
||||
(if (and mu4e-headers-hide-enabled mu4e-headers-hide-predicate
|
||||
(funcall mu4e-headers-hide-predicate msg))
|
||||
(progn
|
||||
(cl-incf mu4e~headers-hidden)
|
||||
nil)
|
||||
(progn
|
||||
(mu4e~headers-apply-flags
|
||||
msg
|
||||
(mapconcat (lambda (f-w) (mu4e~headers-field-handler f-w msg))
|
||||
mu4e-headers-fields " "))))
|
||||
|
||||
mu4e-headers-fields " ")))))
|
||||
|
||||
(defsubst mu4e~headers-insert-header (msg pos)
|
||||
"Insert a header for MSG at point POS."
|
||||
@ -716,7 +737,8 @@ docid is not found."
|
||||
|
||||
(defun mu4e~headers-view-this-message-p (docid)
|
||||
"Is DOCID currently being viewed?"
|
||||
(mu4e-get-view-buffers (lambda (_) (eq docid (plist-get mu4e~view-message :docid)))))
|
||||
(mu4e-get-view-buffers
|
||||
(lambda (_) (eq docid (plist-get mu4e~view-message :docid)))))
|
||||
|
||||
;; note: this function is very performance-sensitive
|
||||
(defun mu4e~headers-append-handler (msglst)
|
||||
@ -869,8 +891,9 @@ after the end of the search results."
|
||||
(goto-char (point-max))
|
||||
(let ((inhibit-read-only t)
|
||||
(str (if (zerop count) mu4e~no-matches mu4e~end-of-results))
|
||||
(msg (format "Found %d matching message%s%s"
|
||||
(msg (format "Found %d matching message%s; %d hidden%s"
|
||||
count (if (= 1 count) "" "s")
|
||||
mu4e~headers-hidden
|
||||
(mu4e~headers-benchmark-message count))))
|
||||
|
||||
(insert (propertize str 'face 'mu4e-system-face 'intangible t))
|
||||
@ -882,7 +905,8 @@ after the end of the search results."
|
||||
(when mu4e--search-msgid-target
|
||||
(if (eq (current-buffer) (window-buffer))
|
||||
(mu4e-headers-goto-message-id mu4e--search-msgid-target)
|
||||
(let* ((pos (mu4e-headers-goto-message-id mu4e--search-msgid-target)))
|
||||
(let* ((pos (mu4e-headers-goto-message-id
|
||||
mu4e--search-msgid-target)))
|
||||
(when pos
|
||||
(set-window-point (get-buffer-window nil t) pos)))))
|
||||
(when (and mu4e--search-view-target (mu4e-message-at-point 'noerror))
|
||||
@ -931,14 +955,7 @@ after the end of the search results."
|
||||
|
||||
(define-key map "j" 'mu4e~headers-jump-to-maildir)
|
||||
(define-key map "O" 'mu4e-headers-change-sorting)
|
||||
(define-key map "M" 'mu4e-headers-toggle-setting)
|
||||
|
||||
;; these are impossible to remember; use mu4e-headers-toggle-setting
|
||||
;; instead :)
|
||||
(define-key map "P" 'mu4e-headers-toggle-threading)
|
||||
(define-key map "Q" 'mu4e-headers-toggle-full-search)
|
||||
(define-key map "W" 'mu4e-headers-toggle-include-related)
|
||||
(define-key map "V" 'mu4e-headers-toggle-skip-duplicates)
|
||||
(define-key map "P" 'mu4e-headers-toggle-property)
|
||||
|
||||
(define-key map "q" 'mu4e~headers-quit-buffer)
|
||||
(define-key map "g" 'mu4e-search-rerun) ;; for compatibility
|
||||
@ -962,7 +979,8 @@ after the end of the search results."
|
||||
(define-key map (kbd "C-+") 'mu4e-headers-split-view-grow)
|
||||
(define-key map (kbd "C--") 'mu4e-headers-split-view-shrink)
|
||||
(define-key map (kbd "<C-kp-add>") 'mu4e-headers-split-view-grow)
|
||||
(define-key map (kbd "<C-kp-subtract>") 'mu4e-headers-split-view-shrink)
|
||||
(define-key map (kbd "<C-kp-subtract>")
|
||||
'mu4e-headers-split-view-shrink)
|
||||
|
||||
;; switching to view mode (if it's visible)
|
||||
(define-key map "y" 'mu4e-select-other-view)
|
||||
@ -986,10 +1004,14 @@ after the end of the search results."
|
||||
(define-key map (kbd "=") 'mu4e-headers-mark-for-untrash)
|
||||
(define-key map (kbd "&") 'mu4e-headers-mark-custom)
|
||||
|
||||
(define-key map (kbd "*") 'mu4e-headers-mark-for-something)
|
||||
(define-key map (kbd "<kp-multiply>") 'mu4e-headers-mark-for-something)
|
||||
(define-key map (kbd "<insertchar>") 'mu4e-headers-mark-for-something)
|
||||
(define-key map (kbd "<insert>") 'mu4e-headers-mark-for-something)
|
||||
(define-key map (kbd "*")
|
||||
'mu4e-headers-mark-for-something)
|
||||
(define-key map (kbd "<kp-multiply>")
|
||||
'mu4e-headers-mark-for-something)
|
||||
(define-key map (kbd "<insertchar>")
|
||||
'mu4e-headers-mark-for-something)
|
||||
(define-key map (kbd "<insert>")
|
||||
'mu4e-headers-mark-for-something)
|
||||
|
||||
(define-key map (kbd "#") 'mu4e-mark-resolve-deferred-marks)
|
||||
|
||||
@ -1023,18 +1045,6 @@ after the end of the search results."
|
||||
|
||||
(define-key menumap [sepa0] '("--"))
|
||||
|
||||
(define-key menumap [toggle-include-related]
|
||||
'(menu-item "Toggle related messages"
|
||||
mu4e-headers-toggle-include-related
|
||||
:button (:toggle .
|
||||
(and (boundp 'mu4e-headers-include-related)
|
||||
mu4e-headers-include-related))))
|
||||
(define-key menumap [toggle-threading]
|
||||
'(menu-item "Toggle threading" mu4e-headers-toggle-threading
|
||||
:button (:toggle .
|
||||
(and (boundp 'mu4e-search-threads)
|
||||
mu4e-search-threads))))
|
||||
|
||||
(define-key menumap "|" '("Pipe through shell" . mu4e-view-pipe))
|
||||
(define-key menumap [sepa1] '("--"))
|
||||
|
||||
@ -1296,12 +1306,15 @@ message plist, or nil if not found."
|
||||
`((,mu4e-search-full . ,mu4e-headers-full-label)
|
||||
(,mu4e-headers-include-related . ,mu4e-headers-related-label)
|
||||
(,mu4e-search-threads . ,mu4e-headers-threaded-label)
|
||||
(,mu4e-headers-skip-duplicates . ,mu4e-headers-skip-duplicates-label))
|
||||
(,mu4e-headers-skip-duplicates
|
||||
. ,mu4e-headers-skip-duplicates-label)
|
||||
(,mu4e-headers-hide-enabled . ,mu4e-headers-hide-label))
|
||||
""))
|
||||
(name "mu4e-headers"))
|
||||
|
||||
(setq mode-name name)
|
||||
(setq mu4e~headers-mode-line-label (concat flagstr " " mu4e--search-last-query))
|
||||
(setq mu4e~headers-mode-line-label
|
||||
(concat flagstr " " mu4e--search-last-query))
|
||||
|
||||
(make-local-variable 'global-mode-string)
|
||||
|
||||
@ -1407,7 +1420,8 @@ matching messages with that mark."
|
||||
(let ((name (mu4e-contact-name contact))
|
||||
(email (mu4e-contact-email contact)))
|
||||
(or (and name (string-match pattern name))
|
||||
(and email (string-match pattern email))))) value)
|
||||
(and email (string-match pattern email)))))
|
||||
value)
|
||||
(string-match pattern (or value ""))))))))
|
||||
|
||||
(defun mu4e-headers-mark-custom ()
|
||||
@ -1501,7 +1515,8 @@ user)."
|
||||
(or field
|
||||
(mu4e-read-option "Sortfield: " mu4e~headers-sort-field-choices)))
|
||||
;; note: 'sortable' is either a boolean (meaning: if non-nil, this is
|
||||
;; sortable field), _or_ another field (meaning: sort by this other field).
|
||||
;; sortable field), _or_ another field (meaning: sort by this other
|
||||
;; field).
|
||||
(sortable (plist-get (cdr (assoc field mu4e-header-info)) :sortable))
|
||||
;; error check
|
||||
(sortable
|
||||
@ -1526,69 +1541,31 @@ user)."
|
||||
(symbol-name mu4e-headers-sort-direction))
|
||||
(mu4e-search-rerun)))
|
||||
|
||||
|
||||
(defun mu4e-headers-toggle-setting (&optional dont-refresh)
|
||||
(defun mu4e-headers-toggle-property (&optional dont-refresh key)
|
||||
"Toggle some aspect of headers display.
|
||||
When prefix-argument DONT-REFRESH is non-nill, do not refresh the
|
||||
last search with the new setting."
|
||||
When prefix-argument DONT-REFRESH is non-nil, do not refresh the
|
||||
last search with the new setting.
|
||||
If KEY is provided, use it instead of asking user."
|
||||
(interactive "P")
|
||||
(let* ((toggles '(("fFull-search" . mu4e-search-full)
|
||||
("rInclude-related" . mu4e-headers-include-related)
|
||||
("tShow threads" . mu4e-search-threads)
|
||||
("uSkip duplicates" . mu4e-headers-skip-duplicates)))
|
||||
("uSkip duplicates" . mu4e-headers-skip-duplicates)
|
||||
("pHide-predicate" . mu4e-headers-hide-enabled)))
|
||||
(toggles (seq-map
|
||||
(lambda (cell)
|
||||
(cons
|
||||
(concat (car cell) (format" (%s)"
|
||||
(concat (car cell)
|
||||
(format" (%s)"
|
||||
(if (symbol-value (cdr cell)) "on" "off")))
|
||||
(cdr cell))) toggles))
|
||||
(choice (mu4e-read-option "Toggle setting " toggles)))
|
||||
(choice (mu4e-read-option "Toggle property " toggles key)))
|
||||
(when choice
|
||||
(set choice (not (symbol-value choice)))
|
||||
(mu4e-message "Set `%s' to %s" (symbol-name choice) (symbol-value choice))
|
||||
(unless dont-refresh
|
||||
(mu4e-search-rerun)))))
|
||||
|
||||
|
||||
(defun mu4e~headers-toggle (name togglevar dont-refresh)
|
||||
"Toggle variable TOGGLEVAR for feature NAME. Unless DONT-REFRESH is non-nil,
|
||||
re-run the last search."
|
||||
(set togglevar (not (symbol-value togglevar)))
|
||||
(mu4e-message "%s turned %s%s"
|
||||
name
|
||||
(if (symbol-value togglevar) "on" "off")
|
||||
(if dont-refresh
|
||||
" (press 'g' to refresh)" ""))
|
||||
(unless dont-refresh
|
||||
(mu4e-search-rerun)))
|
||||
|
||||
(defun mu4e-headers-toggle-threading (&optional dont-refresh)
|
||||
"Toggle `mu4e-search-threads'. With prefix-argument, do
|
||||
_not_ refresh the last search with the new setting for threading."
|
||||
(interactive "P")
|
||||
(mu4e~headers-toggle "Threading" 'mu4e-search-threads dont-refresh))
|
||||
|
||||
(defun mu4e-headers-toggle-full-search (&optional dont-refresh)
|
||||
"Toggle `mu4e-search-full'. With prefix-argument, do
|
||||
_not_ refresh the last search with the new setting for threading."
|
||||
(interactive "P")
|
||||
(mu4e~headers-toggle "Full-search"
|
||||
'mu4e-search-full dont-refresh))
|
||||
|
||||
(defun mu4e-headers-toggle-include-related (&optional dont-refresh)
|
||||
"Toggle `mu4e-headers-include-related'. With prefix-argument, do
|
||||
_not_ refresh the last search with the new setting for threading."
|
||||
(interactive "P")
|
||||
(mu4e~headers-toggle "Include-related"
|
||||
'mu4e-headers-include-related dont-refresh))
|
||||
|
||||
(defun mu4e-headers-toggle-skip-duplicates (&optional dont-refresh)
|
||||
"Toggle `mu4e-headers-skip-duplicates'. With prefix-argument, do
|
||||
_not_ refresh the last search with the new setting for threading."
|
||||
(interactive "P")
|
||||
(mu4e~headers-toggle "Skip-duplicates"
|
||||
'mu4e-headers-skip-duplicates dont-refresh))
|
||||
|
||||
(defun mu4e-headers-view-message ()
|
||||
"View message at point."
|
||||
(interactive)
|
||||
@ -1637,7 +1614,8 @@ return nil."
|
||||
;; update all windows showing the headers buffer
|
||||
(walk-windows
|
||||
(lambda (win)
|
||||
(when (eq (window-buffer win) (mu4e-get-headers-buffer (buffer-name)))
|
||||
(when (eq (window-buffer win)
|
||||
(mu4e-get-headers-buffer (buffer-name)))
|
||||
(set-window-point win (point))))
|
||||
nil t)
|
||||
;; If the assigned (and buffer-local) `mu4e~headers-view-win'
|
||||
@ -1701,7 +1679,8 @@ given, offer to edit the search query before executing it."
|
||||
(list maildir current-prefix-arg)))
|
||||
(when maildir
|
||||
(let* ((query (format "maildir:\"%s\"" maildir))
|
||||
(query (if edit (mu4e-search-read-query "Refine query: " query) query)))
|
||||
(query (if edit
|
||||
(mu4e-search-read-query "Refine query: " query) query)))
|
||||
(mu4e-mark-handle-when-leaving)
|
||||
(mu4e-search query))))
|
||||
|
||||
@ -1741,7 +1720,8 @@ pass ACTIONFUNC, which is a function that takes a msg-plist
|
||||
argument."
|
||||
(interactive)
|
||||
(let ((msg (mu4e-message-at-point))
|
||||
(afunc (or actionfunc (mu4e-read-option "Action: " mu4e-headers-actions))))
|
||||
(afunc (or actionfunc
|
||||
(mu4e-read-option "Action: " mu4e-headers-actions))))
|
||||
(funcall afunc msg)))
|
||||
|
||||
(defun mu4e-headers-mark-and-next (mark)
|
||||
@ -1779,14 +1759,18 @@ other windows."
|
||||
(when mu4e-dim-when-loading
|
||||
(setq mu4e--loading-overlay-bg
|
||||
(let ((overlay (make-overlay (point-min) (point-max))))
|
||||
(overlay-put overlay 'face `(:foreground "gray22" :background
|
||||
,(face-attribute 'default :background)))
|
||||
(overlay-put overlay 'face
|
||||
`(:foreground "gray22" :background
|
||||
,(face-attribute 'default
|
||||
:background)))
|
||||
(overlay-put overlay 'priority 9998)
|
||||
overlay)))
|
||||
(setq mu4e--loading-overlay-text
|
||||
(let ((overlay (make-overlay (point-min) (point-min))))
|
||||
(overlay-put overlay 'priority 9999)
|
||||
(overlay-put overlay 'before-string (propertize "Loading…\n" 'face 'mu4e-header-title-face))
|
||||
(overlay-put overlay 'before-string
|
||||
(propertize "Loading…\n"
|
||||
'face 'mu4e-header-title-face))
|
||||
overlay)))
|
||||
(when mu4e--loading-overlay-bg
|
||||
(delete-overlay mu4e--loading-overlay-bg))
|
||||
|
||||
@ -164,22 +164,24 @@ Does a local-exit and does not return."
|
||||
nil
|
||||
(mu4e-error "Missing property %s in %s" prop lst))))
|
||||
|
||||
(defun mu4e--read-char-choice (prompt choices)
|
||||
(defun mu4e--read-char-choice (prompt choices &optional key)
|
||||
"Read and return one of CHOICES, prompting for PROMPT.
|
||||
Any input that is not one of CHOICES is ignored. This is mu4e's
|
||||
version of `read-char-choice' which becomes case-insentive after
|
||||
trying an exact match."
|
||||
trying an exact match.
|
||||
|
||||
If optional KEY is provided, use that instead of asking user."
|
||||
(let ((choice) (chosen) (inhibit-quit nil))
|
||||
(while (not chosen)
|
||||
(message nil);; this seems needed...
|
||||
(setq choice (read-char-exclusive prompt))
|
||||
(setq choice (or key (read-char-exclusive prompt)))
|
||||
(if (eq choice 27) (keyboard-quit)) ;; quit if ESC is pressed
|
||||
(setq chosen (or (member choice choices)
|
||||
(member (downcase choice) choices)
|
||||
(member (upcase choice) choices))))
|
||||
(car chosen)))
|
||||
|
||||
(defun mu4e-read-option (prompt options)
|
||||
(defun mu4e-read-option (prompt options &optional key)
|
||||
"Ask user for an option from a list on the input area.
|
||||
PROMPT describes a multiple-choice question to the user. OPTIONS
|
||||
describe the options, and is a list of cells describing
|
||||
@ -200,6 +202,9 @@ user can then choose by typing CHAR. Example:
|
||||
User now will be presented with a list: \"Choose an animal:
|
||||
[M]onkey, [G]nu, [x]Moose\".
|
||||
|
||||
If optional character KEY is provied, use that instead of asking
|
||||
the user.
|
||||
|
||||
Function returns the cdr of the list element."
|
||||
(let* ((prompt (mu4e-format "%s" prompt))
|
||||
(optionsstr
|
||||
@ -221,7 +226,8 @@ Function returns the cdr of the list element."
|
||||
" [" (propertize "C-g" 'face 'mu4e-highlight-face)
|
||||
" to cancel]")
|
||||
;; the allowable chars
|
||||
(seq-map (lambda(elm) (string-to-char (car elm))) options)))
|
||||
(seq-map (lambda(elm) (string-to-char (car elm))) options)
|
||||
key))
|
||||
(chosen
|
||||
(seq-find
|
||||
(lambda (option) (eq response (string-to-char (car option))))
|
||||
|
||||
@ -150,6 +150,16 @@
|
||||
(make-obsolete-variable 'mu4e-headers-field-properties-function
|
||||
"not used" "1.6.1")
|
||||
|
||||
(define-obsolete-function-alias 'mu4e-headers-toggle-setting
|
||||
'mu4e-headers-toggle-property "1.9.5")
|
||||
(define-obsolete-function-alias 'mu4e-headers-toggle-threading
|
||||
'mu4e-headers-toggle-property "1.9.5")
|
||||
(define-obsolete-function-alias 'mu4e-headers-toggle-full-search
|
||||
'mu4e-headers-toggle-settin "1.9.5")
|
||||
(define-obsolete-function-alias 'mu4e-headers-toggle-include-related
|
||||
'mu4e-headers-toggle-property "1.9.5")
|
||||
(define-obsolete-function-alias 'mu4e-headers-toggle-skip-duplicates
|
||||
'mu4e-headers-toggle-property "1.9.5")
|
||||
|
||||
|
||||
;; mu4e-main
|
||||
|
||||
@ -163,7 +163,8 @@ Then, display the results."
|
||||
;; it have linked headers buffer?
|
||||
((mu4e-current-buffer-type-p 'view)
|
||||
(when (mu4e--view-detached-p (current-buffer))
|
||||
(mu4e-error "You cannot navigate in a detached view 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))))
|
||||
@ -645,7 +646,8 @@ As a side-effect, a message that is being viewed loses its
|
||||
;;
|
||||
;; Otherwise, `mu4e-display-buffer' may adjust the view buffer's
|
||||
;; window height based on a buffer that has no text in it yet!
|
||||
(setq-local mu4e~headers-view-win (mu4e-display-buffer gnus-article-buffer nil))
|
||||
(setq-local mu4e~headers-view-win
|
||||
(mu4e-display-buffer gnus-article-buffer nil))
|
||||
(unless (window-live-p mu4e~headers-view-win)
|
||||
(mu4e-error "Cannot get a message view"))
|
||||
(select-window mu4e~headers-view-win)))
|
||||
@ -887,9 +889,7 @@ This is useful for advising some Gnus-functionality that does not work in mu4e."
|
||||
|
||||
;; toggle header settings
|
||||
(define-key map "O" #'mu4e-headers-change-sorting)
|
||||
(define-key map "P" #'mu4e-headers-toggle-threading)
|
||||
(define-key map "Q" #'mu4e-headers-toggle-full-search)
|
||||
(define-key map "W" #'mu4e-headers-toggle-include-related)
|
||||
(define-key map "P" #'mu4e-headers-toggle-property)
|
||||
|
||||
;; change the number of headers
|
||||
(define-key map (kbd "C-+") #'mu4e-headers-split-view-grow)
|
||||
|
||||
@ -950,10 +950,7 @@ M-left,\ previous query
|
||||
M-right next query
|
||||
|
||||
O change sort order
|
||||
P toggle threading
|
||||
Q toggle full-search
|
||||
V toggle skip-duplicates
|
||||
W toggle include-related
|
||||
P toggle search property
|
||||
|
||||
marking
|
||||
-------
|
||||
@ -1037,14 +1034,14 @@ The header field used for sorting is indicated by ``@t{V}'' or
|
||||
variable @code{mu4e-use-fancy-chars}}, indicating the sort order
|
||||
(descending or ascending, respectively).
|
||||
|
||||
You can change the sort order by clicking the corresponding column with
|
||||
the mouse, or with @kbd{M-x mu4e-headers-change-sorting} (@key{O}); note
|
||||
that not all fields can be used for sorting. You can toggle threading
|
||||
on/off using @kbd{M-x mu4e-headers-toggle-threading} or @key{P}. For
|
||||
both of these functions, unless you provide a prefix argument
|
||||
(@key{C-u}), the current search is updated immediately using the new
|
||||
parameters. You can toggle full-search (@ref{Searching}) using @kbd{M-x
|
||||
mu4e-headers-toggle-full-search} or @key{Q}.
|
||||
You can change the sort order by clicking the corresponding column with the
|
||||
mouse, or with @kbd{M-x mu4e-headers-change-sorting} (@key{O}); note that not
|
||||
all fields can be used for sorting. You can toggle threading on/off through
|
||||
@kbd{M-x mu4e-headers-toggle-property} or @key{Pt}. For both of these functions,
|
||||
unless you provide a prefix argument (@key{C-u}), the current search is updated
|
||||
immediately using the new parameters. You can toggle full-search
|
||||
(@ref{Searching}) through @kbd{M-x mu4e-headers-toggle-property} as well; or
|
||||
@key{Pf}.
|
||||
|
||||
Note that with threading enabled, the sorting is exclusively by date,
|
||||
regardless of the column clicked.
|
||||
@ -1274,6 +1271,9 @@ b search bookmark
|
||||
B edit bookmark before search
|
||||
j jump to maildir
|
||||
|
||||
O change sort order
|
||||
P toggle search property
|
||||
|
||||
M-left previous query
|
||||
M-right next query
|
||||
|
||||
@ -1728,12 +1728,11 @@ order for this to work properly you need to pass your address to
|
||||
executing a query for messages that happen to have the property of being in a
|
||||
certain folder (maildir).
|
||||
|
||||
Normally, queries return up to @code{mu4e-headers-results-limit} (default:
|
||||
500) results. That is usually more than enough, and makes things significantly
|
||||
Normally, queries return up to @code{mu4e-headers-results-limit} (default: 500)
|
||||
results. That is usually more than enough, and makes things significantly
|
||||
faster. Sometimes, however, you may want to show @emph{all} results; you can
|
||||
enable this with @kbd{M-x mu4e-headers-toggle-full-search}, or by customizing
|
||||
the variable @code{mu4e-headers-full-search}. This applies to all search
|
||||
commands.
|
||||
enable this with @kbd{M-x mu4e-headers-toggle-property}, or by customizing the
|
||||
variable @code{mu4e-headers-full-search}. This applies to all search commands.
|
||||
|
||||
You can also influence the sort order and whether threads are shown or not;
|
||||
see @ref{Sorting and threading}.
|
||||
@ -3798,10 +3797,12 @@ completion.
|
||||
Set @code{mu4e-cache-maildir-list} to @code{t} (make sure to read
|
||||
its docstring).
|
||||
|
||||
@subsection How can I hide messages from the search results?
|
||||
See the variable @code{mu4e-headers-hide-predicate}.
|
||||
@subsection How can I hide certain messages from the search results?
|
||||
See the variables @code{mu4e-headers-hide-predicate} and
|
||||
@code{mu4e-headers-hide-enabled}. The latter can be toggled through
|
||||
@code{mu4e-headers-toggle-property}.
|
||||
|
||||
For example, to filter out GMail's spam, set it to:
|
||||
For example, to filter out GMail's spam folder, set it to:
|
||||
@lisp
|
||||
(setq mu4e-headers-hide-predicate
|
||||
(lambda (msg)
|
||||
|
||||
Reference in New Issue
Block a user