mirror of https://github.com/djcb/mu.git
mu4e: by default, make changing to current context a no-op
Update mu4e-context-switch to not call the enter/leave functions when 'changing' to the current context. However, calling those functions (if defined) can be force through a prefix arg. Document this. Make mu4e-context-determine recognize 'policies', i.e. what to do when no context matches. This part is WIP.
This commit is contained in:
parent
6bafb39960
commit
60192a60d2
|
@ -372,8 +372,8 @@ tempfile)."
|
|||
(put 'mu4e-compose-parent-message 'permanent-local t)
|
||||
(let ((context (mu4e-context-determine mu4e-compose-parent-message)))
|
||||
(if context
|
||||
(mu4e-context-switch (mu4e-context-name context))
|
||||
(when mu4e-contexts (mu4e-context-switch))))
|
||||
(mu4e-context-switch nil (mu4e-context-name context))
|
||||
(when mu4e-contexts (mu4e-context-switch nil))))
|
||||
(run-hooks 'mu4e-compose-pre-hook)
|
||||
|
||||
;; this opens (or re-opens) a messages with all the basic headers set.
|
||||
|
|
|
@ -59,22 +59,35 @@ for the message replied to or forwarded, and nil otherwise. Before composing a n
|
|||
;; if it matches, nil otherwise
|
||||
vars) ;; alist of variables.
|
||||
|
||||
(defun mu4e-context-switch (&optional name)
|
||||
(defun mu4e~context-ask-user (prompt)
|
||||
"Let user choose some context based on its name."
|
||||
(when mu4e-contexts
|
||||
(let* ((names (map 'list (lambda (context) (cons (mu4e-context-name context) context))
|
||||
mu4e-contexts))
|
||||
(context (mu4e-read-option prompt names)))
|
||||
(or context (mu4e-error "No such context")))))
|
||||
|
||||
(defun mu4e-context-switch (&optional force name)
|
||||
"Switch context to a context with NAME which is part of
|
||||
`mu4e-contexts'; if NAME is nil, query user."
|
||||
(interactive)
|
||||
`mu4e-contexts'; if NAME is nil, query user.
|
||||
|
||||
If the new context is the same and the current context, only
|
||||
switch (run associated functions) when prefix argument FORCE is
|
||||
non-nil."
|
||||
(interactive "P")
|
||||
(unless mu4e-contexts
|
||||
(mu4e-error "No contexts defined"))
|
||||
(let* ((names (map 'list (lambda (context)
|
||||
(cons (mu4e-context-name context) context))
|
||||
mu4e-contexts))
|
||||
(context
|
||||
(if name (cdr-safe (assoc name names))
|
||||
(mu4e-read-option "Switch to context: " names))))
|
||||
(if name
|
||||
(cdr-safe (assoc name names))
|
||||
(mu4e~context-ask-user "Switch to context: "))))
|
||||
(unless context (mu4e-error "No such context"))
|
||||
|
||||
;; leave the current context
|
||||
(when (and mu4e~context-current (mu4e-context-leave-func mu4e~context-current))
|
||||
;; if new context is same as old one one switch with FORCE is set.
|
||||
(when (or force (not (eq context (mu4e-context-current))))
|
||||
(when (and (mu4e-context-current) (mu4e-context-leave-func mu4e~context-current))
|
||||
(funcall (mu4e-context-leave-func mu4e~context-current)))
|
||||
;; enter the new context
|
||||
(when (mu4e-context-enter-func context)
|
||||
|
@ -84,7 +97,7 @@ for the message replied to or forwarded, and nil otherwise. Before composing a n
|
|||
(set (car cell) (cdr cell)))
|
||||
(mu4e-context-vars context)))
|
||||
(setq mu4e~context-current context)
|
||||
(mu4e-message "Switched context to %s" (mu4e-context-name context))
|
||||
(mu4e-message "Switched context to %s" (mu4e-context-name context)))
|
||||
context))
|
||||
|
||||
(defun mu4e-context-autoselect ()
|
||||
|
@ -95,19 +108,26 @@ match, return the first."
|
|||
(mu4e-context-switch
|
||||
(mu4e-context-name (mu4e-context-determine nil 'pick-first)))))
|
||||
|
||||
(defun mu4e-context-determine (msg &optional pick-first)
|
||||
(defun mu4e-context-determine (msg &optional policy)
|
||||
"Return the first context with a match-func that returns t. MSG
|
||||
points to the plist for the message replied to or forwarded, or
|
||||
nil if there is no such MSG; similar to what
|
||||
`mu4e-compose-pre-hook' does.
|
||||
points to the plist for the message replied to or forwarded, or
|
||||
nil if there is no such MSG; similar to what
|
||||
`mu4e-compose-pre-hook' does.
|
||||
|
||||
If there are contexts but none match, return nil, unless
|
||||
PICK-FIRST is non-nil, in which case return the first context."
|
||||
POLICY determines what to do if there are contexts but none match. The following
|
||||
are supported:
|
||||
- pick-first: pick the first of the contexts available
|
||||
- ask: ask the user
|
||||
- otherwise, return nil. Effectively, this leaves the current context in place."
|
||||
(when mu4e-contexts
|
||||
(or (find-if (lambda (context)
|
||||
(and (mu4e-context-match-func context)
|
||||
(funcall (mu4e-context-match-func context) msg))) mu4e-contexts)
|
||||
(when pick-first (car mu4e-contexts)))))
|
||||
;; no context found
|
||||
(case policy
|
||||
(pick-first (car mu4e-contexts))
|
||||
(ask (mu4e~context-ask-user "Select context: "))
|
||||
(otherwise nil)))))
|
||||
|
||||
(provide 'mu4e-context)
|
||||
|
||||
|
|
|
@ -1809,7 +1809,8 @@ Note - in the @ref{Headers view} you may see the 'friendly name' for a
|
|||
list; however, when searching you need the real name. You can see the
|
||||
real name for a mailing list from the friendly name's tool-tip.
|
||||
|
||||
@item Get messages with a subject soccer, Socrates, society, ...; note that the '*'-wildcard can only appear as a term's rightmost character:
|
||||
@item Get messages with a subject soccer, Socrates, society, ...; note that
|
||||
the '*'-wildcard can only appear as a term's rightmost character:
|
||||
@verbatim
|
||||
subject:soc*
|
||||
@end verbatim
|
||||
|
@ -2358,13 +2359,20 @@ when starting; see the discussion in the previous section.
|
|||
|
||||
Couple of notes:
|
||||
@itemize
|
||||
@item You can manually switch the focus use @code{M-x mu4e-context-switch}, by default bound to @code{;} in headers, view and main mode. The current focus appears in the mode-line.
|
||||
@item The function @code{mu4e-context-current} returns the current-context; the current context is also visiable in the mode-line when in headers, view or main mode.
|
||||
@item You can set any kind of variable; including settings for mail servers etc. However, settings like @code{mu4e-maildir} and @code{mu4e-mu-home} are not changeable after they have been set without quiting @t{mu4e} first.
|
||||
@item @code{leave-func} (if defined) for the context we are leaving, is invoked before the @code{enter-func} (if defined) of the context we are entering.
|
||||
@item You can manually switch the focus use @code{M-x mu4e-context-switch}, by default bound to @kbd{;} in headers, view and main mode.
|
||||
The current focus appears in the mode-line.
|
||||
@item Normally, @code{M-x mu4e-context-switch} does not call the enter/leave functions if the 'new' context is the same as the old one.
|
||||
However, with a prefix-argument (@kbd{C-u}), you can force @t{mu4e} to call
|
||||
those function even in that case.
|
||||
@item The function @code{mu4e-context-current} returns the current-context; the current context is also visiable in the mode-line when in
|
||||
headers, view or main mode.
|
||||
@item You can set any kind of variable; including settings for mail servers etc. However, settings like @code{mu4e-maildir}
|
||||
and @code{mu4e-mu-home} are not changeable after they have been set without quiting @t{mu4e} first.
|
||||
@item @code{leave-func} (if defined) for the context we are leaving, is invoked before the @code{enter-func} (if defined) of the
|
||||
context we are entering.
|
||||
@item @code{enter-func} (if defined) is invoked before setting the variables.
|
||||
@item @code{match-func} (if defined) is invoked just before @code{mu4e-compose-pre-hook}.
|
||||
@item Finally, be careful to get the quotations right -- backticks, single quotes and commas and note the '.' between variable name and value.
|
||||
@item Finally, be careful to get the quotations right -- backticks, single quotes and commas and note the '.' between variable name and its value.
|
||||
@end itemize
|
||||
|
||||
@node Some context tricks
|
||||
|
@ -3508,7 +3516,8 @@ five arguments, following @t{completing-read}. The default value is
|
|||
@t{ido-completing-read}; to use emacs's default behaviour, set the
|
||||
variable to @t{completing-read}. Helm users can use the same value, and
|
||||
by enabling @t{helm-mode} use helm-style completion.
|
||||
@item @emph{I have a lot of Maildir folders, so regenerating them each time makes things slow. What can I do?}
|
||||
@item @emph{I have a lot of Maildir folders, so regenerating them each time makes
|
||||
things slow. What can I do?}
|
||||
Set @code{mu4e-cache-maildir-list} to @code{t} (but make sure to read
|
||||
its docstring).
|
||||
|
||||
|
@ -3540,7 +3549,8 @@ messages}.
|
|||
like Gmail does?} Yes -- see @ref{Including related messages}.
|
||||
@item @emph{There seem to be a lot of duplicate messages -- how can I get rid
|
||||
of them?} See @ref{Skipping duplicates}.
|
||||
@item @emph{How can I use the @t{eww} browser to view rich-text messages?} See @ref{Html2text functions}.
|
||||
@item @emph{How can I use the @t{eww} browser to view rich-text messages?}
|
||||
See @ref{Html2text functions}.
|
||||
@item @emph{Some messages are almost unreadable in emacs - can I view them in
|
||||
an external web browser?} Indeed, airlines often send messages that
|
||||
heavily depend on html and are hard to digest inside emacs. Fortunately,
|
||||
|
|
Loading…
Reference in New Issue