From dd1e11289af462f0593a99de0964802b2f1672f4 Mon Sep 17 00:00:00 2001 From: djcb Date: Sun, 1 Apr 2012 12:31:23 +0300 Subject: [PATCH] * add user-settable variables mu4e-view-wrap-lines and mu4e-view-hide-cited, which determine the initial way a message is displayed. document this. --- emacs/mu4e-view.el | 96 ++++++++++++++++++++++++++-------------------- emacs/mu4e.el | 53 ++++++++++++++++++------- emacs/mu4e.texi | 24 +++++++----- 3 files changed, 109 insertions(+), 64 deletions(-) diff --git a/emacs/mu4e-view.el b/emacs/mu4e-view.el index 23aba01b..c1327a86 100644 --- a/emacs/mu4e-view.el +++ b/emacs/mu4e-view.el @@ -55,7 +55,9 @@ wanting to show specific messages - for example, `mu4e-org'." "Display the message MSG in a new buffer, and keep in sync with HDRSBUF. 'In sync' here means that moving to the next/previous message in the the message view affects HDRSBUF, as does marking etc. If -UPDATE is non-nil, the current message will be (visually) updated. +UPDATE is nil, the current message may be (visually) 'massaged', +based on the settings of `mu4e-view-wrap-lines' and +`mu4e-view-hide-cited'. As a side-effect, a message that is being viewed loses its 'unread' marking if it still had that." @@ -69,7 +71,6 @@ marking if it still had that." (let ((fieldname (cdr (assoc field mu4e-header-names))) (fieldval (plist-get msg field))) (case field - (:subject (mu4e-view-header fieldname fieldval)) (:path (mu4e-view-header fieldname fieldval)) (:maildir (mu4e-view-header fieldname fieldval)) @@ -122,6 +123,15 @@ marking if it still had that." (mu4e-mark-footer) (mu4e-make-urls-clickable) + (unless update + ;; if we're showing the message for the first time, use the values of + ;; user-settable variables `mu4e-view-wrap-lines' and + ;; `mu4e-view-hide-cited' to determine whether we should wrap/hide + (progn + (when mu4e-view-wrap-lines (mu4e-view-wrap-lines)) + (when mu4e-view-hide-cited (mu4e-view-hide-cited)))) + + ;; no use in trying to set flags again (unless update (mu4e-view-mark-as-read-maybe))))) @@ -328,13 +338,8 @@ if IS-OPEN is nil, and otherwise open it." (fset 'mu4e-view-mode-map mu4e-view-mode-map) -(defvar mu4e-wrap-lines nil - "*internal* Whether to wrap lines or not (variable controlled by - `mu4e-view-toggle-wrap-lines').") - -(defvar mu4e-hide-cited nil - "*internal* Whether to hide cited lines or not (the variable can - be changed with `mu4e-view-toggle-hide-cited').") +(defvar mu4e-lines-wrapped nil "*internal* Whether lines are wrapped.") +(defvar mu4e-cited-hidden nil "*internal* Whether cited lines are hidden.") (define-derived-mode mu4e-view-mode special-mode "mu4e:view" "Major mode for viewing an e-mail message in mu4e. @@ -345,14 +350,18 @@ if IS-OPEN is nil, and otherwise open it." (make-local-variable 'mu4e-current-msg) (make-local-variable 'mu4e-link-map) - (make-local-variable 'mu4e-wrap-lines) - (make-local-variable 'mu4e-hide-cited) + (make-local-variable 'mu4e-lines-wrapped) + (make-local-variable 'mu4e-cited-hidden) - (setq - truncate-lines t)) + ;; filladapt is much better than the built-in filling + ;; esp. with '>' cited parts + (when (fboundp 'filladapt-mode) + (filladapt-mode)) + + (setq truncate-lines t)) -;; we mark messages are as read when we leave the message; ie., when skipping to +;; we mark messages are as read when we leave the message; i.e., when skipping to ;; the next/previous one, or leaving the view buffer altogether. (defun mu4e-view-mark-as-read-maybe () @@ -372,7 +381,7 @@ Seen; if the message is not New/Unread, do nothing." (let ((more-lines t)) (goto-char (point-min)) (while more-lines - ;; Get the citation level at point -- ie., the number of '>' + ;; Get the citation level at point -- i.e., the number of '>' ;; prefixes, starting with 0 for 'no citation' (beginning-of-line 1) (let* ((text (re-search-forward "[[:word:]]" (line-end-position 1) t 1)) @@ -422,7 +431,6 @@ Seen; if the message is not New/Unread, do nothing." (browse-url url)))) - ;; this is fairly simplistic... (defun mu4e-make-urls-clickable () "Turn things that look like URLs into clickable things, and @@ -553,45 +561,51 @@ See the `org-contacts' documentation for more details." ((eq name-or-email 'email) (or (cdr-safe from) "")) (t (error "Not supported: %S" name-or-email)))))) + + +(defun mu4e-view-wrap-lines () + "Wrap lines in the message body." + (save-excursion + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (when (search-forward "\n\n") ;; search for the message body + (fill-region (point) (point-max))) + (setq mu4e-lines-wrapped t)))) + +(defun mu4e-view-hide-cited () + "Toggle hiding of cited lines in the message body." + (save-excursion + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (flush-lines "^[:blank:]*>") + (setq mu4e-cited-hidden t)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - ;; Interactive functions (defun mu4e-view-toggle-wrap-lines () "Toggle line wrap in the message body." (interactive) - (if mu4e-wrap-lines - (progn - (setq mu4e-wrap-lines nil) - (mu4e-view-refresh)) ;; back to normal - (save-excursion - (let ((inhibit-read-only t)) - (setq mu4e-wrap-lines t) - (goto-char (point-min)) - (when (search-forward "\n\n") ;; search for the message body - (fill-region (point) (point-max))))))) + (if mu4e-lines-wrapped + (mu4e-view-refresh) + (mu4e-view-wrap-lines))) (defun mu4e-view-toggle-hide-cited () "Toggle hiding of cited lines in the message body." (interactive) - (if mu4e-hide-cited - (progn - (setq mu4e-hide-cited nil) - (mu4e-view-refresh)) - (save-excursion - (let ((inhibit-read-only t)) - (goto-char (point-min)) - (flush-lines "^[:blank:]*>") - (setq mu4e-hide-cited t))))) - + (if mu4e-cited-hidden + (mu4e-view-refresh) + (mu4e-view-hide-cited))) (defun mu4e-view-refresh () - "Redisplay the current message." + "Redisplay the current message, without wrapped lines or hidden +citations." (interactive) - (mu4e-view mu4e-current-msg mu4e-hdrs-buffer t)) - + (mu4e-view mu4e-current-msg mu4e-hdrs-buffer t) + (setq + mu4e-lines-wrapped nil + mu4e-cited-hidden nil)) (defun mu4e-view-quit-buffer () "Quit the message view and return to the headers." diff --git a/emacs/mu4e.el b/emacs/mu4e.el index a87c6ce4..b3350289 100644 --- a/emacs/mu4e.el +++ b/emacs/mu4e.el @@ -137,7 +137,7 @@ sent folder." ;; Folders (defgroup mu4e-folders nil - "Special folders for mm." + "Special folders." :group 'mu4e) (defcustom mu4e-sent-folder "/sent" @@ -241,6 +241,31 @@ recommended you use \"html2text -utf8 -width 72\"." :group 'mu4e-view :safe 'stringp) + +(defcustom mu4e-view-wrap-lines nil + "Whether to automatically wrap lines in the body of messages when +viewing them. Note that wrapping does not work well with all +messages, but you can always toggle between wrapped/unwrapped +display with `mu4e-view-toggle-wrap-lines (default keybinding: )." + :group 'mu4e-view) + +(defcustom mu4e-view-wrap-lines nil + "Whether to automatically wrap lines in the body of messages when +viewing them. Note that wrapping does not work well with all +messages, but you can always toggle between wrapped/unwrapped +display with `mu4e-view-toggle-wrap-lines (default keybinding: )." + :group 'mu4e-view) + + +(defcustom mu4e-view-hide-cited nil + "Whether to automatically hide cited parts of messages (as +determined by the presence of '> ' at the beginning of the +line). Note that you can always toggle between hidden/unhidden +display with `mu4e-view-toggle-hide-cited (default keybinding: +)." + :group 'mu4e-view) + + ;; Composing / Sending messages (defgroup mu4e-compose nil "Customizations for composing/sending messages." @@ -283,18 +308,18 @@ sent folder." ;; Faces (defgroup mu4e-faces nil - "Faces used in by mm." + "Type faces (fonts) used in mu4e." :group 'mu4e :group 'faces) (defface mu4e-unread-face '((t :inherit font-lock-keyword-face :bold t)) - "Face for an unread mm message header." + "Face for an unread message header." :group 'mu4e-faces) (defface mu4e-moved-face '((t :inherit font-lock-comment-face :slant italic)) - "Face for an mm message header that has been moved to some + "Face for a message header that has been moved to some folder (it's still visible in the search results, since we cannot be sure it no longer matches)." :group 'mu4e-faces) @@ -312,22 +337,24 @@ flag set)." (defface mu4e-header-face '((t :inherit default)) - "Face for an mm header without any special flags." + "Face for a header without any special flags." :group 'mu4e-faces) -(defface mu4e-title-face - '((t :inherit font-lock-type-face)) - "Face for an mm title." +(defface mu4e-header-title-face + '((t :inherit font-lock-type-face :underline t)) + "Face for a header title in the headers view." :group 'mu4e-faces) (defface mu4e-view-header-key-face '((t :inherit font-lock-builtin-face :bold t)) - "Face for the header title (such as \"Subject\" in the message view)." + "Face for a header title (such as \"Subject\") in the message + view." :group 'mu4e-faces) (defface mu4e-view-header-value-face '((t :inherit font-lock-doc-face)) - "Face for the header value (such as \"Re: Hello!\" in the message view)." + "Face for a header value (such as \"Re: Hello!\") in the message + view." :group 'mu4e-faces) (defface mu4e-view-link-face @@ -408,7 +435,7 @@ view). Most fields should be self-explanatory. A special one is in which case it will be equal to `:to'.)") -;; mm startup function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mu4e-create-maildir-maybe (dir) "Offer to create DIR if it does not exist yet. Return t if the dir already existed, or has been created, nil otherwise." @@ -449,7 +476,7 @@ dir already existed, or has been created, nil otherwise." "*internal* The mu4e update timer.") (defun mu4e () - "Start mm. We do this by sending a 'ping' to the mu server + "Start mu4e. We do this by sending a 'ping' to the mu server process, and start the main view if the 'pong' we receive from the server has the expected values." (interactive) @@ -477,7 +504,7 @@ server has the expected values." (mu4e-proc-ping))))) (defun mu4e-quit() - "Quit the mm session." + "Quit the mu4e session." (interactive) (when (y-or-n-p "Are you sure you want to quit? ") (message nil) diff --git a/emacs/mu4e.texi b/emacs/mu4e.texi index fd238b11..fd6dc930 100644 --- a/emacs/mu4e.texi +++ b/emacs/mu4e.texi @@ -65,11 +65,11 @@ really @emph{needs} another one, but maybe @emph{I} do! I spend a @emph{lot} of time, both professionally and privately, dealing with e-mail -- having an efficient e-mail client is essential for me. Since none of the existing ones worked they I wanted, I created my own. - + Still, even while having been created for such selfish motives, the feedback of many early adopters has been used to ensure that @t{mu4e} works well for other people as well. - + @node Other mail clients @section Other mail clients @@ -113,7 +113,7 @@ messages around and so on. In this chapter, we go through installing @t{mu4e} and see how to set it up. After we have succeeded in @ref{Getting mail}, and @ref{Indexing your -messages}, we discuss @ref{Basic configuration}. +messages}, we discuss @ref{Basic configuration}. After going through these steps, @t{mu4e} should be ready for use. @@ -555,11 +555,20 @@ On Sun 21 Dec 2003 09:06:34 PM EET, Paul wrote: Some notes: @itemize -@item You can customize the header fields to show by setting the +@item You can determine which header fields are shown by setting the variable @code{mu4e-view-fields}. @item You can customize the date format by setting the variable @code{mu4e-date-format-long}, using the same format that @code{format-time-string} uses. +@item The body text can be line-wrapped (toggle between wrapped/not-wrapped with +@key{w}) and/or cited parts can be hidden (toggle between hidden/not-hidden +with @key{h}. If you want to do this by default when viewing messages, you can +set, respectively, @code{mu4e-view-wrap-lines} and @code{mu4e-view-hide-cited} +to @code{t}. @footnote{If you have installed the @t{filladapt} package +(@url{http://www.wonderworks.com/download/filladapt.el}), @t{mu4e} will use +it for line-wrapping, as it generally does a better job than the default +mechanism emacs provides.} + @end itemize You can find most things you can do with this message in the @emph{View} menu, @@ -630,11 +639,6 @@ set up with something like the following in your initialization files: Normally, @t{mu4e} prefers the text-version of an e-mail message to determine the message body. You can change this by setting @code{mu4e-view-prefer-html}. -Note: if you have installed the -@t{filladapt}@footnote{@url{http://www.wonderworks.com/download/filladapt.el}} -package, @t{mu4e} will use it for line-wrapping of the body text (@key{w}), as -it generally does a better job than the mechanism emacs provides by default. - @node Editor view @section Editor view @@ -762,7 +766,7 @@ If you have queries that you use often, you may want to store them as invoke them in other places as well. Bookmark searches are available in the main view @ref{Main view}, header view @xref{Headers view}, and message view @xref{Message view}, using (by default) the key @key{b} -(@code{mu4e-search-bookmark}). +(@code{mu4e-search-bookmark}). @code{mu4e} provides some default bookmarks, which you can override. The