mirror of
https://github.com/djcb/mu.git
synced 2024-06-29 07:51:04 +02:00
* mu4e: improve `mu4e-compose-pre-hook', document it
This commit is contained in:
parent
c17d3911bd
commit
ed516d54d7
|
@ -76,9 +76,12 @@ replying to messages."
|
||||||
(defvar mu4e-compose-pre-hook nil
|
(defvar mu4e-compose-pre-hook nil
|
||||||
"Hook run just *before* message composition starts. If the
|
"Hook run just *before* message composition starts. If the
|
||||||
compose-type is either /reply/ or /forward/, the variable
|
compose-type is either /reply/ or /forward/, the variable
|
||||||
`mu4e-compose-parent-message' points to the message replied to / being forwarded.")
|
`mu4e-compose-parent-message' points to the message replied to /
|
||||||
|
being forwarded / edited.")
|
||||||
|
|
||||||
(defvar mu4e-compose-parent-message nil)
|
(defvar mu4e-compose-parent-message nil
|
||||||
|
"The parent message plist (ie., the message being replied to,
|
||||||
|
forwarded or edited) in `mu4e-compose-pre-hook.")
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
|
@ -668,11 +671,11 @@ buffer."
|
||||||
|
|
||||||
(defun mu4e~compose-run-hooks (compose-type)
|
(defun mu4e~compose-run-hooks (compose-type)
|
||||||
"Run the hooks defined for `mu4e-compose-pre-hook'. If
|
"Run the hooks defined for `mu4e-compose-pre-hook'. If
|
||||||
compose-type is either `reply' or `forward',
|
compose-type is `reply', `forward' or `edit',
|
||||||
`mu4e-compose-parent-message' points to the message being forwarded
|
`mu4e-compose-parent-message' points to the message being forwarded
|
||||||
or replied to, otherwise it is nil."
|
or replied to, otherwise it is nil."
|
||||||
(setq mu4e-compose-parent-message
|
(setq mu4e-compose-parent-message
|
||||||
(when (member compose-type '(reply forward))
|
(when (member compose-type '(reply forward edit))
|
||||||
(mu4e-message-at-point)))
|
(mu4e-message-at-point)))
|
||||||
(run-hooks 'mu4e-compose-pre-hook))
|
(run-hooks 'mu4e-compose-pre-hook))
|
||||||
|
|
||||||
|
@ -681,34 +684,30 @@ or replied to, otherwise it is nil."
|
||||||
a symbol, one of `reply', `forward', `edit', `new'. All but `new'
|
a symbol, one of `reply', `forward', `edit', `new'. All but `new'
|
||||||
take the message at point as input. Symbol `edit' is only allowed
|
take the message at point as input. Symbol `edit' is only allowed
|
||||||
for draft messages."
|
for draft messages."
|
||||||
|
|
||||||
(unless (member compose-type '(reply forward edit new))
|
(unless (member compose-type '(reply forward edit new))
|
||||||
(mu4e-error "Invalid compose type '%S'" compose-type))
|
(mu4e-error "Invalid compose type '%S'" compose-type))
|
||||||
|
(when (and (eq compose-type 'edit)
|
||||||
|
(not (member 'draft (mu4e-field-at-point :flags))))
|
||||||
|
(mu4e-error "Editing is only allowed for draft messages"))
|
||||||
|
|
||||||
|
;; run the hooks
|
||||||
|
(mu4e~compose-run-hooks compose-type)
|
||||||
|
|
||||||
;; 'new is special, since it takes no existing message as arg therefore,
|
;; 'new is special, since it takes no existing message as arg therefore,
|
||||||
;; we don't need to call thec backend, and call the handler *directly*
|
;; we don't need to call thec backend, and call the handler *directly*
|
||||||
(if (eq compose-type 'new)
|
(if (eq compose-type 'new)
|
||||||
(mu4e~compose-handler 'new)
|
(mu4e~compose-handler 'new)
|
||||||
|
|
||||||
;; otherwise, we need the doc-id
|
;; otherwise, we need the doc-id
|
||||||
(let ((docid (mu4e-field-at-point :docid)))
|
(let ((docid (mu4e-field-at-point :docid)))
|
||||||
;; note, the first two chars of the line (the mark margin) does *not*
|
;; if there's a visible view window, select that before starting composing
|
||||||
;; have the 'draft property; thus, we check one char before the end of
|
;; a new message, so that one will be replaced by the compose window. The
|
||||||
;; the current line instead
|
;; 10-or-so line headers buffer is not a good place to write it...
|
||||||
(unless (or (not (eq compose-type 'edit))
|
|
||||||
(member 'draft (mu4e-field-at-point :flags)))
|
|
||||||
(mu4e-error "Editing is only allowed for draft messages"))
|
|
||||||
|
|
||||||
(mu4e~compose-run-hooks compose-type)
|
|
||||||
|
|
||||||
;; if there's a visible view window, select that before starting
|
|
||||||
;; composing a new message, so that one will be replaced by the
|
|
||||||
;; compose window. The 10-or-so line headers buffer is not a good way
|
|
||||||
;; to write it...
|
|
||||||
(let ((viewwin (get-buffer-window mu4e~view-buffer)))
|
(let ((viewwin (get-buffer-window mu4e~view-buffer)))
|
||||||
(when (window-live-p viewwin)
|
(when (window-live-p viewwin)
|
||||||
(select-window viewwin)))
|
(select-window viewwin)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; talk to the backend
|
;; talk to the backend
|
||||||
(mu4e~proc-compose compose-type docid))))
|
(mu4e~proc-compose compose-type docid))))
|
||||||
|
|
||||||
|
|
147
mu4e/mu4e.texi
147
mu4e/mu4e.texi
|
@ -1065,6 +1065,64 @@ the start of 2010.
|
||||||
filter out other 'junk' e-mail addresses; defaults to @t{noreply}.
|
filter out other 'junk' e-mail addresses; defaults to @t{noreply}.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
|
@subsection Compose hooks
|
||||||
|
@anchor{Compose hooks}
|
||||||
|
|
||||||
|
If you want to execute some custom action before message composition starts,
|
||||||
|
you can define a @emph{hook function}. @t{mu4e} offers two hooks:
|
||||||
|
@itemize
|
||||||
|
@item @code{mu4e-compose-pre-hook}: this hook is run @emph{before} composition
|
||||||
|
starts; if you are composing a @emph{reply}, @emph{forward} a message, or
|
||||||
|
@emph{edit} an existing message, the variable
|
||||||
|
@code{mu4e-compose-parent-message} points to the message being replied to,
|
||||||
|
forwarded or edit, and you can use @code{mu4e-msg-field} to get the value of
|
||||||
|
various properties (and see @ref{The message s-expression}).
|
||||||
|
@item @code{mu4e-compose-mode-hook}: this hook is run just before composition
|
||||||
|
starts, when the whole buffer has already been set up. This is a good place
|
||||||
|
for editing-related settings. @code{mu4e-compose-parent-message} (see above)
|
||||||
|
is also at your disposal.
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
Let's look at some examples.
|
||||||
|
|
||||||
|
First, suppose we want to set the @t{From:}-address for a reply message based
|
||||||
|
on the receiver of the original:
|
||||||
|
@lisp
|
||||||
|
;; messages sent to me@@foo.com should be replied with me@@foo.com as From:
|
||||||
|
;; address; messages sent to me@@bar.com should be replied with me@@bar.com as From:
|
||||||
|
;; address; all other mail should use me@@cuux.com as From: address
|
||||||
|
(add-hook 'mu4e-compose-pre-hook
|
||||||
|
(defun my-set-from-address ()
|
||||||
|
"Set the From address based on the To address of the original."
|
||||||
|
(let ((orig-to (cdar (mu4e-msg-field mu4e-compose-parent-message :to))))
|
||||||
|
(setq user-mail-address
|
||||||
|
(cond
|
||||||
|
((string= "me@@foo.com" orig-to) "me@@foo.com")
|
||||||
|
((string= "me@@bar.com" orig-to) "me@@bar.com")
|
||||||
|
(t "me@@cuux.com"))))))
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
Second, as mentioned, @code{mu4e-compose-mode-hook} is especially useful for
|
||||||
|
editing-related settings. For example:
|
||||||
|
@lisp
|
||||||
|
(add-hook 'mu4e-compose-mode-hook
|
||||||
|
(defun my-do-compose-stuff ()
|
||||||
|
"My settings for message composition."
|
||||||
|
(set-fill-column 72)
|
||||||
|
(flyspell-mode)))
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
This hook is also useful for adding headers or changing headers, since the
|
||||||
|
message is fully formed when this hook runs. For example, to add a
|
||||||
|
@t{Bcc:}-header, you could add something like the following:
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
(add-hook 'mu4e-compose-mode-hook
|
||||||
|
(defun my-add-bcc ()
|
||||||
|
"Add a Bcc: header."
|
||||||
|
(message-add-header "Bcc: me@@example.com\n")))
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
|
||||||
@subsection Queuing mail
|
@subsection Queuing mail
|
||||||
@anchor{Queuing mail}
|
@anchor{Queuing mail}
|
||||||
|
@ -2097,6 +2155,8 @@ Mail' folder by pressing @kbd{ma}.
|
||||||
In this chapter we list a number of actual and anticipated questions and their
|
In this chapter we list a number of actual and anticipated questions and their
|
||||||
answers.
|
answers.
|
||||||
|
|
||||||
|
@subsection General
|
||||||
|
|
||||||
@itemize
|
@itemize
|
||||||
@item @emph{How can I quickly delete/move/trash a lot of messages?} You can
|
@item @emph{How can I quickly delete/move/trash a lot of messages?} You can
|
||||||
select ('mark' in emacs-speak) the messages like you would select text in a
|
select ('mark' in emacs-speak) the messages like you would select text in a
|
||||||
|
@ -2106,34 +2166,6 @@ can also use functions like @code{mu4e-headers-mark-thread} (@key{T}),
|
||||||
@code{mu4e-headers-mark-subthread} (@key{t}) to mark whole threads at the same
|
@code{mu4e-headers-mark-subthread} (@key{t}) to mark whole threads at the same
|
||||||
time, and @code{mu4e-headers-mark-pattern} (@key{%}) to mark all messages
|
time, and @code{mu4e-headers-mark-pattern} (@key{%}) to mark all messages
|
||||||
matching a certain regular expression.
|
matching a certain regular expression.
|
||||||
@item @emph{How can I use @t{BBDB}?} Currently, there is no built-in for
|
|
||||||
address management with @t{BBDB}; instead, we recommend using @t{mu4e}'s
|
|
||||||
built-in @ref{Address autocompletion}.
|
|
||||||
@item @emph{How can I automatically set the @t{From:} address for a
|
|
||||||
reply-message, based on some field in the original?} Currently, you cannot do
|
|
||||||
that automatically. It is possible to do it non-automatically though, with
|
|
||||||
something like:
|
|
||||||
@lisp
|
|
||||||
(defun mu4e-change-from ()
|
|
||||||
"Change the from header."
|
|
||||||
(interactive)
|
|
||||||
(save-excursion
|
|
||||||
(when (message-goto-from)
|
|
||||||
(message-delete-line))
|
|
||||||
(goto-char (point-min))
|
|
||||||
(insert
|
|
||||||
(concat "From: "
|
|
||||||
(ido-completing-read "From: "
|
|
||||||
'("Mail1 <foo@@bar.com>"
|
|
||||||
"Mail2 <test@@example.com>"
|
|
||||||
"Mail3 <another@@cuux.org>"))
|
|
||||||
"\n"))))
|
|
||||||
@end lisp
|
|
||||||
@item @emph{And what about customizable folders for sent messages, based on
|
|
||||||
the @t{From:} header?} This is currently not possible either, but you can
|
|
||||||
periodically move messages from the main sent-folder to the specific
|
|
||||||
sent-folders. You can easily find those messages with a query like
|
|
||||||
@t{maildir:/sent from:myaddress@@example.com}.
|
|
||||||
@item @emph{mu4e seems to return a mere subset of all matches - how can I get
|
@item @emph{mu4e seems to return a mere subset of all matches - how can I get
|
||||||
all?}. Indeed, for speed reasons (and because, if you are like the author, you
|
all?}. Indeed, for speed reasons (and because, if you are like the author, you
|
||||||
usually don't need thousands of matches), @t{mu4e} returns only up to the
|
usually don't need thousands of matches), @t{mu4e} returns only up to the
|
||||||
|
@ -2141,24 +2173,6 @@ value of the variable @code{m4ue-search-result-limit} matches. To show
|
||||||
@emph{all} results, use @t{M-x mu4e-headers-toggle-full-search}, or customize
|
@emph{all} results, use @t{M-x mu4e-headers-toggle-full-search}, or customize
|
||||||
the variable @code{mu4e-headers-full-search}. This applies to all search
|
the variable @code{mu4e-headers-full-search}. This applies to all search
|
||||||
commands.
|
commands.
|
||||||
@item @emph{How can I automatically add some header to an outgoing message?}
|
|
||||||
You can use @code{mu4e-compose-mode-hook}. For example, to add a Bcc:-header,
|
|
||||||
you could add something like the following to your configuration:
|
|
||||||
|
|
||||||
@lisp
|
|
||||||
(add-hook 'mu4e-compose-mode-hook
|
|
||||||
(defun add-bcc ()
|
|
||||||
(message-add-header "Bcc: me@@example.com\n")))
|
|
||||||
@end lisp
|
|
||||||
|
|
||||||
@item @emph{How can I show attached images in my message view buffers?} See
|
|
||||||
@ref{Viewing images inline}.
|
|
||||||
@item @emph{How can I easily include attachments in the messages I write?}
|
|
||||||
You can drag-and-drop from your desktop; alternatively, you can use @t{dired}
|
|
||||||
-- see @ref{Attaching files with dired}.
|
|
||||||
@item @emph{@t{mu4e} seems to remove myself from the Cc: list; how can I
|
|
||||||
prevent that?}
|
|
||||||
Set @code{mu4e-compose-keep-self-cc} to @t{t} in your configuration.
|
|
||||||
@item @emph{When I try to run @t{mu index} while @t{mu4e} is running I get
|
@item @emph{When I try to run @t{mu index} while @t{mu4e} is running I get
|
||||||
errors like @t{mu: mu_store_new_writable: xapian error 'Unable to get write
|
errors like @t{mu: mu_store_new_writable: xapian error 'Unable to get write
|
||||||
lock on ~/.mu/xapian: already locked'}. What can I do about this?} You get
|
lock on ~/.mu/xapian: already locked'}. What can I do about this?} You get
|
||||||
|
@ -2177,18 +2191,50 @@ seems to work quite well.
|
||||||
@item @emph{Can I automatically apply the marks on messages when
|
@item @emph{Can I automatically apply the marks on messages when
|
||||||
leaving the headers buffer?} Yes you can -- see the documentation on
|
leaving the headers buffer?} Yes you can -- see the documentation on
|
||||||
@t{mu4e-headers-leave-behavior}.
|
@t{mu4e-headers-leave-behavior}.
|
||||||
@item @emph{How can I automatically apply word-wrapping (and hiding cited
|
|
||||||
parts) when viewing a message?} See the documentation on
|
|
||||||
@t{mu4e-view-wrap-lines} (and @t{mu4e-view-hide-cited}). You can always toggle
|
|
||||||
between the two states with @key{w} and @key{h}, respectively.
|
|
||||||
@item @emph{Is there context-sensitive help available?} Yes - pressing @key{H}
|
@item @emph{Is there context-sensitive help available?} Yes - pressing @key{H}
|
||||||
should take you to the right place in this manual.
|
should take you to the right place in this manual.
|
||||||
@item @emph{How can I set @t{mu4e} as the default e-mail client in emacs?}
|
@item @emph{How can I set @t{mu4e} as the default e-mail client in emacs?}
|
||||||
See @ref{Setting the default emacs mail program}.
|
See @ref{Setting the default emacs mail program}.
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
|
||||||
|
@subsection Reading messages
|
||||||
|
|
||||||
|
@itemize
|
||||||
|
@item @emph{How can I show attached images in my message view buffers?} See
|
||||||
|
@ref{Viewing images inline}.
|
||||||
|
@item @emph{How can I automatically apply word-wrapping (and hiding cited
|
||||||
|
parts) when viewing a message?} See the documentation on
|
||||||
|
@t{mu4e-view-wrap-lines} (and @t{mu4e-view-hide-cited}). You can always toggle
|
||||||
|
between the two states with @key{w} and @key{h}, respectively.
|
||||||
@item @emph{How can I perform custom actions on messages and attachments?} See
|
@item @emph{How can I perform custom actions on messages and attachments?} See
|
||||||
@ref{Actions}.
|
@ref{Actions}.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
|
|
||||||
|
@subsection Writing messages
|
||||||
|
|
||||||
|
@itemize
|
||||||
|
@item @emph{How can I use @t{BBDB}?} Currently, there is no built-in for
|
||||||
|
address management with @t{BBDB}; instead, we recommend using @t{mu4e}'s
|
||||||
|
built-in @ref{Address autocompletion}.
|
||||||
|
@item @emph{How can I automatically set the @t{From:} address for a
|
||||||
|
reply-message, based on some field in the original?} See @ref{Compose hooks}.
|
||||||
|
@item @emph{And what about customizable folders for sent messages, based on e.g.
|
||||||
|
the @t{From:} header?} Again, see @ref{Compose hooks}; alternatively, you can
|
||||||
|
periodically move messages from the main sent-folder to the specific
|
||||||
|
sent-folders. You can easily find those messages with a query like
|
||||||
|
@t{maildir:/sent from:myaddress@@example.com}.
|
||||||
|
@item @emph{How can I automatically add some header to an outgoing message?}
|
||||||
|
Once more, see @ref{Compose hooks}.
|
||||||
|
@item @emph{How can I easily include attachments in the messages I write?}
|
||||||
|
You can drag-and-drop from your desktop; alternatively, you can use @t{dired}
|
||||||
|
-- see @ref{Attaching files with dired}.
|
||||||
|
@item @emph{@t{mu4e} seems to remove myself from the Cc: list; how can I
|
||||||
|
prevent that?}
|
||||||
|
Set @code{mu4e-compose-keep-self-cc} to @t{t} in your configuration.
|
||||||
|
@end itemize
|
||||||
|
|
||||||
@node Known issues / missing features
|
@node Known issues / missing features
|
||||||
@chapter Known issues / missing features
|
@chapter Known issues / missing features
|
||||||
|
|
||||||
|
@ -2209,7 +2255,6 @@ it should work though, using the built-in mechanisms.
|
||||||
menu assumes the default key-bindings, as do the clicks-on-bookmarks.
|
menu assumes the default key-bindings, as do the clicks-on-bookmarks.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
|
|
||||||
@node How it works
|
@node How it works
|
||||||
@appendix How it works
|
@appendix How it works
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user