mirror of https://github.com/djcb/mu.git
mu4e: Split libraries into outline sections
This commit is contained in:
parent
040c6578be
commit
74332947a0
|
@ -26,6 +26,7 @@
|
||||||
;; manual)
|
;; manual)
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(require 'cl-lib)
|
(require 'cl-lib)
|
||||||
(require 'ido)
|
(require 'ido)
|
||||||
|
|
||||||
|
@ -42,19 +43,17 @@
|
||||||
(defvar mu4e-view-date-format)
|
(defvar mu4e-view-date-format)
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e-action-count-lines (msg)
|
(defun mu4e-action-count-lines (msg)
|
||||||
"Count the number of lines in the e-mail MSG.
|
"Count the number of lines in the e-mail MSG.
|
||||||
Works for headers view and message-view."
|
Works for headers view and message-view."
|
||||||
(message "Number of lines: %s"
|
(message "Number of lines: %s"
|
||||||
(shell-command-to-string
|
(shell-command-to-string
|
||||||
(concat "wc -l < " (shell-quote-argument (mu4e-message-field msg :path))))))
|
(concat "wc -l < " (shell-quote-argument (mu4e-message-field msg :path))))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
(defvar mu4e-msg2pdf
|
(defvar mu4e-msg2pdf
|
||||||
(let ((exec-path (cons (concat mu4e-builddir "/toys/msg2pdf/") exec-path)))
|
(let ((exec-path (cons (concat mu4e-builddir "/toys/msg2pdf/") exec-path)))
|
||||||
(locate-file "msg2pdf" exec-path exec-suffixes))
|
(locate-file "msg2pdf" exec-path exec-suffixes))
|
||||||
|
@ -75,8 +74,8 @@ Works for the message view."
|
||||||
(unless (and pdf (file-exists-p pdf))
|
(unless (and pdf (file-exists-p pdf))
|
||||||
(mu4e-warn "Failed to create PDF file"))
|
(mu4e-warn "Failed to create PDF file"))
|
||||||
(find-file pdf)))
|
(find-file pdf)))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~action-header-to-html (msg field)
|
(defun mu4e~action-header-to-html (msg field)
|
||||||
"Convert the FIELD of MSG to an HTML string."
|
"Convert the FIELD of MSG to an HTML string."
|
||||||
|
@ -156,12 +155,9 @@ privacy aspects in `(mu4e) Displaying rich-text messages'."
|
||||||
(mu4e-error "No xwidget support available"))
|
(mu4e-error "No xwidget support available"))
|
||||||
(xwidget-webkit-browse-url
|
(xwidget-webkit-browse-url
|
||||||
(concat "file://" (mu4e~write-body-to-html msg)) t))
|
(concat "file://" (mu4e~write-body-to-html msg)) t))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
(defconst mu4e-text2speech-command "festival --tts"
|
(defconst mu4e-text2speech-command "festival --tts"
|
||||||
"Program that speaks out text it receives on standard input.")
|
"Program that speaks out text it receives on standard input.")
|
||||||
|
|
||||||
|
@ -173,11 +169,9 @@ privacy aspects in `(mu4e) Displaying rich-text messages'."
|
||||||
(insert (mu4e-message-field msg :body-txt))
|
(insert (mu4e-message-field msg :body-txt))
|
||||||
(shell-command-on-region (point-min) (point-max)
|
(shell-command-on-region (point-min) (point-max)
|
||||||
mu4e-text2speech-command)))
|
mu4e-text2speech-command)))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
(defvar mu4e-captured-message nil
|
(defvar mu4e-captured-message nil
|
||||||
"The most recently captured message.")
|
"The most recently captured message.")
|
||||||
|
|
||||||
|
@ -187,18 +181,15 @@ Later, we can create an attachment based on this message with
|
||||||
`mu4e-compose-attach-captured-message'."
|
`mu4e-compose-attach-captured-message'."
|
||||||
(setq mu4e-captured-message msg)
|
(setq mu4e-captured-message msg)
|
||||||
(message "Message has been captured"))
|
(message "Message has been captured"))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
(defun mu4e-action-copy-message-file-path (msg)
|
(defun mu4e-action-copy-message-file-path (msg)
|
||||||
"Save the full path for the current MSG to the kill ring."
|
"Save the full path for the current MSG to the kill ring."
|
||||||
(kill-new (mu4e-message-field msg :path)))
|
(kill-new (mu4e-message-field msg :path)))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
(defvar mu4e-org-contacts-file nil
|
(defvar mu4e-org-contacts-file nil
|
||||||
"File to store contact information for org-contacts.
|
"File to store contact information for org-contacts.
|
||||||
Needed by `mu4e-action-add-org-contact'.")
|
Needed by `mu4e-action-add-org-contact'.")
|
||||||
|
@ -236,11 +227,8 @@ file where you store your org-contacts."
|
||||||
(message "%S" org-capture-templates)
|
(message "%S" org-capture-templates)
|
||||||
(when (fboundp 'org-capture)
|
(when (fboundp 'org-capture)
|
||||||
(org-capture nil key))))
|
(org-capture nil key))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defvar mu4e~patch-directory-history nil
|
(defvar mu4e~patch-directory-history nil
|
||||||
"History of directories we have applied patches to.")
|
"History of directories we have applied patches to.")
|
||||||
|
@ -280,11 +268,8 @@ bother asking for the git tree again (useful for bulk actions)."
|
||||||
(if signoff "--signoff" "")
|
(if signoff "--signoff" "")
|
||||||
(shell-quote-argument (mu4e-message-field msg :path)))))))
|
(shell-quote-argument (mu4e-message-field msg :path)))))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
(defvar mu4e-action-tags-header "X-Keywords"
|
(defvar mu4e-action-tags-header "X-Keywords"
|
||||||
"Header where tags are stored.
|
"Header where tags are stored.
|
||||||
Used by `mu4e-action-retag-message'. Make sure it is one of the
|
Used by `mu4e-action-retag-message'. Make sure it is one of the
|
||||||
|
|
|
@ -63,9 +63,9 @@
|
||||||
;;
|
;;
|
||||||
;; c) this is handled in our handler for the `sent'-message from the backend
|
;; c) this is handled in our handler for the `sent'-message from the backend
|
||||||
;; (`mu4e-sent-handler')
|
;; (`mu4e-sent-handler')
|
||||||
;;
|
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(require 'cl-lib)
|
(require 'cl-lib)
|
||||||
(require 'message)
|
(require 'message)
|
||||||
(require 'mail-parse)
|
(require 'mail-parse)
|
||||||
|
@ -80,8 +80,8 @@
|
||||||
(require 'mu4e-draft)
|
(require 'mu4e-draft)
|
||||||
(require 'mu4e-context)
|
(require 'mu4e-context)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Composing / Sending messages
|
||||||
;; Composing / Sending messages
|
|
||||||
(defgroup mu4e-compose nil
|
(defgroup mu4e-compose nil
|
||||||
"Customizations for composing/sending messages."
|
"Customizations for composing/sending messages."
|
||||||
:group 'mu4e)
|
:group 'mu4e)
|
||||||
|
@ -203,7 +203,7 @@ place to do that."
|
||||||
"The compose-type for this buffer.
|
"The compose-type for this buffer.
|
||||||
This is a symbol, `new', `forward', `reply' or `edit'.")
|
This is a symbol, `new', `forward', `reply' or `edit'.")
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e-compose-attach-message (msg)
|
(defun mu4e-compose-attach-message (msg)
|
||||||
"Insert message MSG as an attachment."
|
"Insert message MSG as an attachment."
|
||||||
|
@ -224,7 +224,7 @@ Messages are captured with `mu4e-action-capture-message'."
|
||||||
(mu4e-warn "No message has been captured"))
|
(mu4e-warn "No message has been captured"))
|
||||||
(mu4e-compose-attach-message mu4e-captured-message))
|
(mu4e-compose-attach-message mu4e-captured-message))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
;; 'fcc' refers to saving a copy of a sent message to a certain folder. that's
|
;; 'fcc' refers to saving a copy of a sent message to a certain folder. that's
|
||||||
;; what these 'Sent mail' folders are for!
|
;; what these 'Sent mail' folders are for!
|
||||||
|
@ -321,9 +321,11 @@ Message-ID."
|
||||||
;; update the file on disk -- ie., without the separator
|
;; update the file on disk -- ie., without the separator
|
||||||
(mu4e~proc-add (buffer-file-name)))) nil t))
|
(mu4e~proc-add (buffer-file-name)))) nil t))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; address completion
|
||||||
;; address completion; inspired by org-contacts.el and
|
|
||||||
|
;; inspired by org-contacts.el and
|
||||||
;; https://github.com/nordlow/elisp/blob/master/mine/completion-styles-cycle.el
|
;; https://github.com/nordlow/elisp/blob/master/mine/completion-styles-cycle.el
|
||||||
|
|
||||||
(defun mu4e~compose-complete-handler (str pred action)
|
(defun mu4e~compose-complete-handler (str pred action)
|
||||||
"Complete address STR with predication PRED for ACTION."
|
"Complete address STR with predication PRED for ACTION."
|
||||||
(cond
|
(cond
|
||||||
|
@ -374,7 +376,8 @@ removing the In-Reply-To header."
|
||||||
(unless (message-fetch-field "in-reply-to")
|
(unless (message-fetch-field "in-reply-to")
|
||||||
(message-remove-header "References")))
|
(message-remove-header "References")))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defvar mu4e-compose-mode-map nil
|
(defvar mu4e-compose-mode-map nil
|
||||||
"Keymap for \"*mu4e-compose*\" buffers.")
|
"Keymap for \"*mu4e-compose*\" buffers.")
|
||||||
(unless mu4e-compose-mode-map
|
(unless mu4e-compose-mode-map
|
||||||
|
@ -815,7 +818,7 @@ draft message."
|
||||||
(mu4e-compose 'new))
|
(mu4e-compose 'new))
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
;; mu4e-compose-func and mu4e-send-func are wrappers so we can set ourselves
|
;; mu4e-compose-func and mu4e-send-func are wrappers so we can set ourselves
|
||||||
;; as default emacs mailer (define-mail-user-agent etc.)
|
;; as default emacs mailer (define-mail-user-agent etc.)
|
||||||
|
|
||||||
|
@ -901,7 +904,7 @@ buffer buried."
|
||||||
"Return the `mu4e-user-agent' symbol."
|
"Return the `mu4e-user-agent' symbol."
|
||||||
'mu4e-user-agent)
|
'mu4e-user-agent)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e-compose-goto-top (&optional arg)
|
(defun mu4e-compose-goto-top (&optional arg)
|
||||||
"Go to the beginning of the message or buffer.
|
"Go to the beginning of the message or buffer.
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
;; Contributed by sabof
|
;; Contributed by sabof
|
||||||
(defvar bookmark-make-record-function)
|
(defvar bookmark-make-record-function)
|
||||||
|
|
||||||
|
;;; Various simple commands
|
||||||
|
|
||||||
(defun mu4e-headers-mark-all-unread-read ()
|
(defun mu4e-headers-mark-all-unread-read ()
|
||||||
"Put a ! \(read) mark on all visible unread messages."
|
"Put a ! \(read) mark on all visible unread messages."
|
||||||
(interactive)
|
(interactive)
|
||||||
|
@ -45,8 +47,6 @@
|
||||||
(mu4e-headers-mark-all-unread-read)
|
(mu4e-headers-mark-all-unread-read)
|
||||||
(mu4e-mark-execute-all t))
|
(mu4e-mark-execute-all t))
|
||||||
|
|
||||||
;;;
|
|
||||||
|
|
||||||
(defun mu4e-headers-mark-all ()
|
(defun mu4e-headers-mark-all ()
|
||||||
"Mark all messages within current query results and ask user to execute which action."
|
"Mark all messages within current query results and ask user to execute which action."
|
||||||
(interactive)
|
(interactive)
|
||||||
|
@ -55,8 +55,6 @@
|
||||||
(lambda (_msg _param) t))
|
(lambda (_msg _param) t))
|
||||||
(mu4e-mark-execute-all))
|
(mu4e-mark-execute-all))
|
||||||
|
|
||||||
;;;
|
|
||||||
|
|
||||||
;;; Bookmark handlers
|
;;; Bookmark handlers
|
||||||
;;
|
;;
|
||||||
;; Allow bookmarking a mu4e buffer in regular emacs bookmarks.
|
;; Allow bookmarking a mu4e buffer in regular emacs bookmarks.
|
||||||
|
@ -109,13 +107,13 @@ BOOKMARK is a bookmark name or a bookmark record."
|
||||||
,(bookmark-get-bookmark-record bmk))))
|
,(bookmark-get-bookmark-record bmk))))
|
||||||
bookmark))))
|
bookmark))))
|
||||||
|
|
||||||
|
;;; Bogofilter/SpamAssassin
|
||||||
|
;;
|
||||||
;;; handling spam with Bogofilter with possibility to define it for SpamAssassin
|
;; Support for handling spam with Bogofilter with the possibility
|
||||||
;;; contributed by Gour
|
;; to define it for SpamAssassin, contributed by Gour.
|
||||||
|
;;
|
||||||
;; to add the actions to the menu, you can use something like:
|
;; To add the actions to the menu, you can use something like:
|
||||||
|
;;
|
||||||
;; (add-to-list 'mu4e-headers-actions
|
;; (add-to-list 'mu4e-headers-actions
|
||||||
;; '("sMark as spam" . mu4e-register-msg-as-spam) t)
|
;; '("sMark as spam" . mu4e-register-msg-as-spam) t)
|
||||||
;; (add-to-list 'mu4e-headers-actions
|
;; (add-to-list 'mu4e-headers-actions
|
||||||
|
@ -166,11 +164,12 @@ For example for bogofile, use \"/usr/bin/bogofilter -Sn < %s\"")
|
||||||
(shell-command command))
|
(shell-command command))
|
||||||
(mu4e-view-mark-for-something))
|
(mu4e-view-mark-for-something))
|
||||||
|
|
||||||
;;; end of spam-filtering functions
|
;;; Eshell functions
|
||||||
|
;;
|
||||||
|
;; Code for `gnus-dired-attached' modified to run from eshell,
|
||||||
|
;; allowing files to be attached to an email via mu4e using the
|
||||||
|
;; eshell. Does not depend on gnus.
|
||||||
|
|
||||||
;;; eshell functions
|
|
||||||
;; Code for 'gnus-dired-attached' modified to run from eshell, allowing files to
|
|
||||||
;; be attached to an email via mu4e using the eshell. Does not depend on gnus.
|
|
||||||
(defun eshell/mu4e-attach (&rest args)
|
(defun eshell/mu4e-attach (&rest args)
|
||||||
"Attach files to a mu4e message using eshell. If no mu4e
|
"Attach files to a mu4e message using eshell. If no mu4e
|
||||||
buffers found, compose a new message and then attach the file."
|
buffers found, compose a new message and then attach the file."
|
||||||
|
|
|
@ -31,10 +31,8 @@
|
||||||
(require 'mu4e-utils)
|
(require 'mu4e-utils)
|
||||||
(require 'mu4e-message)
|
(require 'mu4e-message)
|
||||||
(require 'message) ;; mail-header-separator
|
(require 'message) ;; mail-header-separator
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; Options
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defcustom mu4e-compose-dont-reply-to-self nil
|
(defcustom mu4e-compose-dont-reply-to-self nil
|
||||||
"If non-nil, don't include self.
|
"If non-nil, don't include self.
|
||||||
|
@ -75,6 +73,8 @@ mu4e-specific version of `message-signature'."
|
||||||
:type 'boolean
|
:type 'boolean
|
||||||
:group 'mu4e-compose)
|
:group 'mu4e-compose)
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defvar mu4e-user-agent-string
|
(defvar mu4e-user-agent-string
|
||||||
(format "mu4e %s; emacs %s" mu4e-mu-version emacs-version)
|
(format "mu4e %s; emacs %s" mu4e-mu-version emacs-version)
|
||||||
"The User-Agent string for mu4e, or nil.")
|
"The User-Agent string for mu4e, or nil.")
|
||||||
|
@ -145,8 +145,7 @@ References. If both are empty, return nil."
|
||||||
(mapconcat (lambda (id) (format "<%s>" id)) refs " ")))
|
(mapconcat (lambda (id) (format "<%s>" id)) refs " ")))
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Determine the recipient fields for new messages
|
||||||
;; determine the recipient fields for new messages
|
|
||||||
|
|
||||||
(defun mu4e~draft-recipients-list-to-string (lst)
|
(defun mu4e~draft-recipients-list-to-string (lst)
|
||||||
"Convert a lst LST of address cells into a string.
|
"Convert a lst LST of address cells into a string.
|
||||||
|
@ -271,9 +270,10 @@ message. Return nil if there are no recipients for the particular field."
|
||||||
(mu4e-error "Unsupported field")))))
|
(mu4e-error "Unsupported field")))))
|
||||||
|
|
||||||
;;; RFC2822 handling of phrases in mail-addresses
|
;;; RFC2822 handling of phrases in mail-addresses
|
||||||
;;; The optional display-name contains a phrase, it sits before the angle-addr
|
;;
|
||||||
;;; as specified in RFC2822 for email-addresses in header fields.
|
;; The optional display-name contains a phrase, it sits before the
|
||||||
;;; contributed by jhelberg
|
;; angle-addr as specified in RFC2822 for email-addresses in header
|
||||||
|
;; fields. Contributed by jhelberg.
|
||||||
|
|
||||||
(defun mu4e~rfc822-phrase-type (ph)
|
(defun mu4e~rfc822-phrase-type (ph)
|
||||||
"Return an atom or quoted-string for the phrase PH.
|
"Return an atom or quoted-string for the phrase PH.
|
||||||
|
@ -317,7 +317,8 @@ This is based on the variable `user-full-name' and
|
||||||
(format "%s" user-mail-address))))
|
(format "%s" user-mail-address))))
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~draft-insert-mail-header-separator ()
|
(defun mu4e~draft-insert-mail-header-separator ()
|
||||||
"Insert `mail-header-separator' in the first empty line of the message.
|
"Insert `mail-header-separator' in the first empty line of the message.
|
||||||
`message-mode' needs this line to know where the headers end and
|
`message-mode' needs this line to know where the headers end and
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
;; headers like 'To:' or 'Subject:')
|
;; headers like 'To:' or 'Subject:')
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(require 'cl-lib)
|
(require 'cl-lib)
|
||||||
(require 'fringe)
|
(require 'fringe)
|
||||||
(require 'hl-line)
|
(require 'hl-line)
|
||||||
|
@ -44,7 +45,8 @@
|
||||||
(declare-function mu4e-view "mu4e-view")
|
(declare-function mu4e-view "mu4e-view")
|
||||||
(declare-function mu4e~main-view "mu4e-main")
|
(declare-function mu4e~main-view "mu4e-main")
|
||||||
|
|
||||||
;; the headers view
|
;;; Options
|
||||||
|
|
||||||
(defgroup mu4e-headers nil
|
(defgroup mu4e-headers nil
|
||||||
"Settings for the headers view."
|
"Settings for the headers view."
|
||||||
:group 'mu4e)
|
:group 'mu4e)
|
||||||
|
@ -217,6 +219,8 @@ but also manually invoked searches."
|
||||||
:type 'hook
|
:type 'hook
|
||||||
:group 'mu4e-headers)
|
:group 'mu4e-headers)
|
||||||
|
|
||||||
|
;;; Public variables
|
||||||
|
|
||||||
(defvar mu4e-headers-sort-field :date
|
(defvar mu4e-headers-sort-field :date
|
||||||
"Field to sort the headers by. Must be a symbol,
|
"Field to sort the headers by. Must be a symbol,
|
||||||
one of: `:date', `:subject', `:size', `:prio', `:from', `:to.',
|
one of: `:date', `:subject', `:size', `:prio', `:from', `:to.',
|
||||||
|
@ -226,6 +230,8 @@ one of: `:date', `:subject', `:size', `:prio', `:from', `:to.',
|
||||||
"Direction to sort by; a symbol either `descending' (sorting
|
"Direction to sort by; a symbol either `descending' (sorting
|
||||||
Z->A) or `ascending' (sorting A->Z).")
|
Z->A) or `ascending' (sorting A->Z).")
|
||||||
|
|
||||||
|
;;;; Fancy marks
|
||||||
|
|
||||||
;; marks for headers of the form; each is a cons-cell (basic . fancy)
|
;; marks for headers of the form; each is a cons-cell (basic . fancy)
|
||||||
;; each of which is basic ascii char and something fancy, respectively
|
;; each of which is basic ascii char and something fancy, respectively
|
||||||
(defvar mu4e-headers-draft-mark '("D" . "⚒") "Draft.")
|
(defvar mu4e-headers-draft-mark '("D" . "⚒") "Draft.")
|
||||||
|
@ -240,7 +246,8 @@ one of: `:date', `:subject', `:size', `:prio', `:from', `:to.',
|
||||||
(defvar mu4e-headers-signed-mark '("s" . "☡") "Signed.")
|
(defvar mu4e-headers-signed-mark '("s" . "☡") "Signed.")
|
||||||
(defvar mu4e-headers-unread-mark '("u" . "⎕") "Unread.")
|
(defvar mu4e-headers-unread-mark '("u" . "⎕") "Unread.")
|
||||||
|
|
||||||
;; thread prefix marks
|
;;;; Graph drawing
|
||||||
|
|
||||||
(defvar mu4e-headers-thread-child-prefix '("├>" . "┣▶ ")
|
(defvar mu4e-headers-thread-child-prefix '("├>" . "┣▶ ")
|
||||||
"Prefix for messages in sub threads that do have a following sibling.")
|
"Prefix for messages in sub threads that do have a following sibling.")
|
||||||
|
|
||||||
|
@ -266,6 +273,8 @@ This prefix should have the same length as `mu4e-headers-thread-connection-prefi
|
||||||
(defvar mu4e-headers-thread-duplicate-prefix '("=" . "≡ ")
|
(defvar mu4e-headers-thread-duplicate-prefix '("=" . "≡ ")
|
||||||
"Prefix for duplicate messages.")
|
"Prefix for duplicate messages.")
|
||||||
|
|
||||||
|
;;;; Various
|
||||||
|
|
||||||
(defvar mu4e-headers-actions
|
(defvar mu4e-headers-actions
|
||||||
'( ("capture message" . mu4e-action-capture-message)
|
'( ("capture message" . mu4e-action-capture-message)
|
||||||
("show this thread" . mu4e-action-show-thread))
|
("show this thread" . mu4e-action-show-thread))
|
||||||
|
@ -304,9 +313,7 @@ PREDICATE-FUNC as PARAM. This is useful for getting user-input.")
|
||||||
"Whether to show all results.
|
"Whether to show all results.
|
||||||
If this is nil show results up to `mu4e-headers-results-limit')")
|
If this is nil show results up to `mu4e-headers-results-limit')")
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Internal variables/constants
|
||||||
|
|
||||||
;;;; internal variables/constants ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
;; docid cookies
|
;; docid cookies
|
||||||
(defconst mu4e~headers-docid-pre "\376"
|
(defconst mu4e~headers-docid-pre "\376"
|
||||||
|
@ -330,7 +337,8 @@ followed by the docid, followed by `mu4e~headers-docid-post'.")
|
||||||
("to" . :to))
|
("to" . :to))
|
||||||
"List of cells describing the various sort-options.
|
"List of cells describing the various sort-options.
|
||||||
In the format needed for `mu4e-read-option'.")
|
In the format needed for `mu4e-read-option'.")
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~headers-clear (&optional msg)
|
(defun mu4e~headers-clear (&optional msg)
|
||||||
"Clear the header buffer and related data structures."
|
"Clear the header buffer and related data structures."
|
||||||
|
@ -343,9 +351,8 @@ In the format needed for `mu4e-read-option'.")
|
||||||
(goto-char (point-min))
|
(goto-char (point-min))
|
||||||
(insert (propertize msg 'face 'mu4e-system-face 'intangible t)))))))
|
(insert (propertize msg 'face 'mu4e-system-face 'intangible t)))))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Handler functions
|
||||||
;; handler functions
|
|
||||||
;;
|
|
||||||
;; next are a bunch of handler functions; those will be called from mu4e~proc in
|
;; next are a bunch of handler functions; those will be called from mu4e~proc in
|
||||||
;; response to output from the server process
|
;; response to output from the server process
|
||||||
|
|
||||||
|
@ -428,8 +435,9 @@ If SKIP-HOOK is absent or nil, `mu4e-message-changed-hook' will be invoked."
|
||||||
(unless skip-hook
|
(unless skip-hook
|
||||||
(run-hooks 'mu4e-message-changed-hook)))
|
(run-hooks 'mu4e-message-changed-hook)))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~headers-contact-str (contacts)
|
(defun mu4e~headers-contact-str (contacts)
|
||||||
"Turn the list of contacts CONTACTS (with elements (NAME . EMAIL)
|
"Turn the list of contacts CONTACTS (with elements (NAME . EMAIL)
|
||||||
into a string."
|
into a string."
|
||||||
|
@ -438,7 +446,8 @@ into a string."
|
||||||
(let ((name (car ct)) (email (cdr ct)))
|
(let ((name (car ct)) (email (cdr ct)))
|
||||||
(or name email "?"))) contacts ", "))
|
(or name email "?"))) contacts ", "))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~headers-thread-prefix-map (type)
|
(defun mu4e~headers-thread-prefix-map (type)
|
||||||
"Return the thread prefix based on the symbol TYPE."
|
"Return the thread prefix based on the symbol TYPE."
|
||||||
(let ((get-prefix
|
(let ((get-prefix
|
||||||
|
@ -454,13 +463,11 @@ into a string."
|
||||||
('duplicate (funcall get-prefix mu4e-headers-thread-duplicate-prefix))
|
('duplicate (funcall get-prefix mu4e-headers-thread-duplicate-prefix))
|
||||||
(t "?"))))
|
(t "?"))))
|
||||||
|
|
||||||
;;;; headers in the buffer are prefixed by an invisible string with the docid
|
;; headers in the buffer are prefixed by an invisible string with the docid
|
||||||
;;;; followed by an EOT ('end-of-transmission', \004, ^D) non-printable ascii
|
;; followed by an EOT ('end-of-transmission', \004, ^D) non-printable ascii
|
||||||
;;;; character. this string also has a text-property with the docid. the former
|
;; character. this string also has a text-property with the docid. the former
|
||||||
;;;; is used for quickly finding a certain header, the latter for retrieving the
|
;; is used for quickly finding a certain header, the latter for retrieving the
|
||||||
;;;; docid at point without string matching etc.
|
;; docid at point without string matching etc.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defun mu4e~headers-docid-pos (docid)
|
(defun mu4e~headers-docid-pos (docid)
|
||||||
"Return the pos of the beginning of the line with the header with
|
"Return the pos of the beginning of the line with the header with
|
||||||
|
@ -596,7 +603,8 @@ while our display may be different)."
|
||||||
('signed (funcall get-prefix mu4e-headers-signed-mark))
|
('signed (funcall get-prefix mu4e-headers-signed-mark))
|
||||||
('unread (funcall get-prefix mu4e-headers-unread-mark)))))))
|
('unread (funcall get-prefix mu4e-headers-unread-mark)))))))
|
||||||
str))
|
str))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defconst mu4e-headers-from-or-to-prefix '("" . "To ")
|
(defconst mu4e-headers-from-or-to-prefix '("" . "To ")
|
||||||
"Prefix for the :from-or-to field.
|
"Prefix for the :from-or-to field.
|
||||||
|
@ -795,9 +803,10 @@ after the end of the search results."
|
||||||
|
|
||||||
;; run-hooks
|
;; run-hooks
|
||||||
(run-hooks 'mu4e-headers-found-hook)))
|
(run-hooks 'mu4e-headers-found-hook)))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defmacro mu4e~headers-defun-mark-for (mark)
|
(defmacro mu4e~headers-defun-mark-for (mark)
|
||||||
"Define a function mu4e~headers-mark-MARK."
|
"Define a function mu4e~headers-mark-MARK."
|
||||||
(let ((funcname (intern (format "mu4e-headers-mark-for-%s" mark)))
|
(let ((funcname (intern (format "mu4e-headers-mark-for-%s" mark)))
|
||||||
|
@ -821,7 +830,8 @@ after the end of the search results."
|
||||||
(mu4e~headers-defun-mark-for unread)
|
(mu4e~headers-defun-mark-for unread)
|
||||||
(mu4e~headers-defun-mark-for action)
|
(mu4e~headers-defun-mark-for action)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defvar mu4e-move-to-trash-patterns '()
|
(defvar mu4e-move-to-trash-patterns '()
|
||||||
"List of regexps to match for moving to trash instead of flagging them.
|
"List of regexps to match for moving to trash instead of flagging them.
|
||||||
This is particularly useful for mailboxes that don't use the
|
This is particularly useful for mailboxes that don't use the
|
||||||
|
@ -844,7 +854,8 @@ Also see `mu4e-view-mark-or-move-to-trash'."
|
||||||
mu4e-trash-folder))
|
mu4e-trash-folder))
|
||||||
(mu4e-headers-next))))
|
(mu4e-headers-next))))
|
||||||
|
|
||||||
;;; headers-mode and mode-map ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Headers-mode and mode-map
|
||||||
|
|
||||||
(defvar mu4e-headers-mode-map nil
|
(defvar mu4e-headers-mode-map nil
|
||||||
"Keymap for *mu4e-headers* buffers.")
|
"Keymap for *mu4e-headers* buffers.")
|
||||||
(unless mu4e-headers-mode-map
|
(unless mu4e-headers-mode-map
|
||||||
|
@ -930,7 +941,6 @@ Also see `mu4e-view-mark-or-move-to-trash'."
|
||||||
|
|
||||||
(define-key map "U" 'mu4e-mark-unmark-all)
|
(define-key map "U" 'mu4e-mark-unmark-all)
|
||||||
(define-key map "x" 'mu4e-mark-execute-all)
|
(define-key map "x" 'mu4e-mark-execute-all)
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(define-key map "a" 'mu4e-headers-action)
|
(define-key map "a" 'mu4e-headers-action)
|
||||||
|
|
||||||
|
@ -1111,8 +1121,8 @@ no user-interaction ongoing."
|
||||||
(mu4e~mark-initialize) ;; initialize the marking subsystem
|
(mu4e~mark-initialize) ;; initialize the marking subsystem
|
||||||
(hl-line-mode 1))
|
(hl-line-mode 1))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Highlighting
|
||||||
;;; highlighting
|
|
||||||
(defvar mu4e~highlighted-docid nil
|
(defvar mu4e~highlighted-docid nil
|
||||||
"The highlighted docid")
|
"The highlighted docid")
|
||||||
|
|
||||||
|
@ -1130,7 +1140,8 @@ Also, unhighlight any previously highlighted headers."
|
||||||
(hl-line-highlight)))
|
(hl-line-highlight)))
|
||||||
(setq mu4e~highlighted-docid docid)))
|
(setq mu4e~highlighted-docid docid)))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~headers-select-window ()
|
(defun mu4e~headers-select-window ()
|
||||||
"When there is a visible window for the headers buffer, make sure
|
"When there is a visible window for the headers buffer, make sure
|
||||||
to select it. This is needed when adding new headers, otherwise
|
to select it. This is needed when adding new headers, otherwise
|
||||||
|
@ -1147,7 +1158,8 @@ message plist, or nil if not found."
|
||||||
(when (and this-msgid (string= msgid this-msgid))
|
(when (and this-msgid (string= msgid this-msgid))
|
||||||
msg)))))
|
msg)))))
|
||||||
|
|
||||||
;;;; markers mark headers for
|
;;; UNNAMED markers mark headers for
|
||||||
|
|
||||||
(defun mu4e~headers-mark (docid mark)
|
(defun mu4e~headers-mark (docid mark)
|
||||||
"(Visually) mark the header for DOCID with character MARK."
|
"(Visually) mark the header for DOCID with character MARK."
|
||||||
(with-current-buffer (mu4e-get-headers-buffer)
|
(with-current-buffer (mu4e-get-headers-buffer)
|
||||||
|
@ -1198,7 +1210,8 @@ docid is not found."
|
||||||
(unless ignore-missing
|
(unless ignore-missing
|
||||||
(mu4e-error "Cannot find message with docid %S" docid)))))
|
(mu4e-error "Cannot find message with docid %S" docid)))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defcustom mu4e-query-rewrite-function 'identity
|
(defcustom mu4e-query-rewrite-function 'identity
|
||||||
"Function that takes a search expression string, and returns a
|
"Function that takes a search expression string, and returns a
|
||||||
possibly changed search expression string.
|
possibly changed search expression string.
|
||||||
|
@ -1296,8 +1309,7 @@ of `mu4e-split-view', and return a window for the message view."
|
||||||
(t ;; no splitting; just use the currently selected one
|
(t ;; no splitting; just use the currently selected one
|
||||||
(selected-window)))))))
|
(selected-window)))))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Search-based marking
|
||||||
;; search-based marking
|
|
||||||
|
|
||||||
(defun mu4e-headers-for-each (func)
|
(defun mu4e-headers-for-each (func)
|
||||||
"Call FUNC for each header, moving point to the header.
|
"Call FUNC for each header, moving point to the header.
|
||||||
|
@ -1459,10 +1471,10 @@ descendants."
|
||||||
(if markpair (mu4e-headers-mark-thread t markpair)
|
(if markpair (mu4e-headers-mark-thread t markpair)
|
||||||
(let ((current-prefix-arg t))
|
(let ((current-prefix-arg t))
|
||||||
(call-interactively 'mu4e-headers-mark-thread))))
|
(call-interactively 'mu4e-headers-mark-thread))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
;;; the query past / present / future ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; The query past / present / future
|
||||||
|
|
||||||
(defvar mu4e~headers-query-past nil
|
(defvar mu4e~headers-query-past nil
|
||||||
"Stack of queries before the present one.")
|
"Stack of queries before the present one.")
|
||||||
(defvar mu4e~headers-query-future nil
|
(defvar mu4e~headers-query-future nil
|
||||||
|
@ -1505,10 +1517,10 @@ or `past'."
|
||||||
(unless mu4e~headers-query-future
|
(unless mu4e~headers-query-future
|
||||||
(mu4e-warn "No more next queries"))
|
(mu4e-warn "No more next queries"))
|
||||||
(pop mu4e~headers-query-future))))
|
(pop mu4e~headers-query-future))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
;;; interactive functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Interactive functions
|
||||||
|
|
||||||
(defvar mu4e~headers-search-hist nil
|
(defvar mu4e~headers-search-hist nil
|
||||||
"History list of searches.")
|
"History list of searches.")
|
||||||
|
|
||||||
|
|
|
@ -23,13 +23,16 @@
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
(require 'smtpmail) ;; the queueing stuff (silence elint)
|
(require 'smtpmail) ;; the queueing stuff (silence elint)
|
||||||
(require 'mu4e-utils) ;; utility functions
|
(require 'mu4e-utils) ;; utility functions
|
||||||
(require 'mu4e-context) ;; the context
|
(require 'mu4e-context) ;; the context
|
||||||
(require 'mu4e-vars) ;; the context
|
(require 'mu4e-vars) ;; the context
|
||||||
(require 'cl-lib)
|
(require 'cl-lib)
|
||||||
|
|
||||||
|
|
||||||
|
;;; Mode
|
||||||
|
|
||||||
(defconst mu4e~main-buffer-name " *mu4e-main*"
|
(defconst mu4e~main-buffer-name " *mu4e-main*"
|
||||||
"*internal* Name of the mu4e main view buffer.")
|
"*internal* Name of the mu4e main view buffer.")
|
||||||
|
|
||||||
|
@ -152,8 +155,7 @@ clicked."
|
||||||
"")
|
"")
|
||||||
"\n"))
|
"\n"))
|
||||||
|
|
||||||
;; NEW
|
;; NEW This is the old `mu4e~main-view' function but without
|
||||||
;; This is the old `mu4e~main-view' function but without
|
|
||||||
;; buffer switching at the end.
|
;; buffer switching at the end.
|
||||||
(defun mu4e~main-view-real (_ignore-auto _noconfirm)
|
(defun mu4e~main-view-real (_ignore-auto _noconfirm)
|
||||||
(let ((buf (get-buffer-create mu4e~main-buffer-name))
|
(let ((buf (get-buffer-create mu4e~main-buffer-name))
|
||||||
|
@ -241,10 +243,9 @@ clicked."
|
||||||
(goto-char (point-min)))
|
(goto-char (point-min)))
|
||||||
(add-to-list 'global-mode-string '(:eval (mu4e-context-label))))
|
(add-to-list 'global-mode-string '(:eval (mu4e-context-label))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Commands
|
||||||
;; Interactive functions
|
|
||||||
;; NEW
|
;; NEW Toggle mail sending mode without switching
|
||||||
;; Toggle mail sending mode without switching
|
|
||||||
(defun mu4e~main-toggle-mail-sending-mode ()
|
(defun mu4e~main-toggle-mail-sending-mode ()
|
||||||
"Toggle sending mail mode, either queued or direct."
|
"Toggle sending mail mode, either queued or direct."
|
||||||
(interactive)
|
(interactive)
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
;; currently in the headers buffer.
|
;; currently in the headers buffer.
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(require 'cl-lib)
|
(require 'cl-lib)
|
||||||
(require 'mu4e-proc)
|
(require 'mu4e-proc)
|
||||||
(require 'mu4e-utils)
|
(require 'mu4e-utils)
|
||||||
|
@ -36,6 +37,8 @@
|
||||||
(declare-function mu4e~headers-goto-docid "mu4e-headers")
|
(declare-function mu4e~headers-goto-docid "mu4e-headers")
|
||||||
(declare-function mu4e-headers-next "mu4e-headers")
|
(declare-function mu4e-headers-next "mu4e-headers")
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defcustom mu4e-headers-leave-behavior 'ask
|
(defcustom mu4e-headers-leave-behavior 'ask
|
||||||
"What to do when user leaves the headers view.
|
"What to do when user leaves the headers view.
|
||||||
That is when he e.g. quits, refreshes or does a new search.
|
That is when he e.g. quits, refreshes or does a new search.
|
||||||
|
@ -63,7 +66,8 @@ message, showing the target makes this quite a bit slower (showing
|
||||||
the target uses an Emacs feature called 'overlays', which aren't
|
the target uses an Emacs feature called 'overlays', which aren't
|
||||||
particularly fast).")
|
particularly fast).")
|
||||||
|
|
||||||
;;; insert stuff;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Insert stuff
|
||||||
|
|
||||||
(defvar mu4e~mark-map nil
|
(defvar mu4e~mark-map nil
|
||||||
"Contains a mapping of docid->markinfo.
|
"Contains a mapping of docid->markinfo.
|
||||||
When a message is marked, the information is added here. markinfo
|
When a message is marked, the information is added here. markinfo
|
||||||
|
@ -432,7 +436,8 @@ If NO-CONFIRMATION is non-nil, don't ask user for confirmation."
|
||||||
(defun mu4e-mark-docid-marked-p (docid)
|
(defun mu4e-mark-docid-marked-p (docid)
|
||||||
"Is the given DOCID marked?"
|
"Is the given DOCID marked?"
|
||||||
(when (gethash docid mu4e~mark-map) t))
|
(when (gethash docid mu4e~mark-map) t))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e-mark-marks-num ()
|
(defun mu4e-mark-marks-num ()
|
||||||
"Return the number of mark-instances in the current buffer."
|
"Return the number of mark-instances in the current buffer."
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
;; Functions to get data from mu4e-message plist structure
|
;; Functions to get data from mu4e-message plist structure
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(require 'cl-lib)
|
(require 'cl-lib)
|
||||||
(require 'mu4e-vars)
|
(require 'mu4e-vars)
|
||||||
(require 'mu4e-utils)
|
(require 'mu4e-utils)
|
||||||
|
@ -83,7 +84,8 @@ message-plist and the text, which is the plain-text version,
|
||||||
ossibly converted from html and/or transformed by earlier rewrite
|
ossibly converted from html and/or transformed by earlier rewrite
|
||||||
functions.")
|
functions.")
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defsubst mu4e-message-field-raw (msg field)
|
(defsubst mu4e-message-field-raw (msg field)
|
||||||
"Retrieve FIELD from message plist MSG.
|
"Retrieve FIELD from message plist MSG.
|
||||||
FIELD is one of :from, :to, :cc, :bcc, :subject, :data,
|
FIELD is one of :from, :to, :cc, :bcc, :subject, :data,
|
||||||
|
@ -307,7 +309,8 @@ A part would look something like:
|
||||||
Eiter in the headers buffer or the view buffer. Field is a
|
Eiter in the headers buffer or the view buffer. Field is a
|
||||||
symbol, see `mu4e-header-info'."
|
symbol, see `mu4e-header-info'."
|
||||||
(plist-get (mu4e-message-at-point) field))
|
(plist-get (mu4e-message-at-point) field))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~html2text-wrapper (func msg)
|
(defun mu4e~html2text-wrapper (func msg)
|
||||||
"Apply FUNC on a temporary buffer with html from MSG.
|
"Apply FUNC on a temporary buffer with html from MSG.
|
||||||
|
|
|
@ -24,9 +24,10 @@
|
||||||
|
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
|
|
||||||
|
;; The expect version here is org 8.x.
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
;; The expect version here is org 8.x
|
|
||||||
(require 'org)
|
(require 'org)
|
||||||
|
|
||||||
(defgroup mu4e-org nil
|
(defgroup mu4e-org nil
|
||||||
|
|
|
@ -23,12 +23,12 @@
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(require 'mu4e-vars)
|
(require 'mu4e-vars)
|
||||||
(require 'mu4e-utils)
|
(require 'mu4e-utils)
|
||||||
(require 'mu4e-meta)
|
(require 'mu4e-meta)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Internal vars
|
||||||
;; internal vars
|
|
||||||
|
|
||||||
(defvar mu4e~proc-buf nil
|
(defvar mu4e~proc-buf nil
|
||||||
"Buffer (string) for data received from the backend.")
|
"Buffer (string) for data received from the backend.")
|
||||||
|
@ -49,6 +49,8 @@
|
||||||
"Regular expression matching the length cookie.
|
"Regular expression matching the length cookie.
|
||||||
Match 1 will be the length (in hex).")
|
Match 1 will be the length (in hex).")
|
||||||
|
|
||||||
|
;;; Functions
|
||||||
|
|
||||||
(defun mu4e~proc-running-p ()
|
(defun mu4e~proc-running-p ()
|
||||||
"Whether the mu process is running."
|
"Whether the mu process is running."
|
||||||
(and mu4e~proc-process
|
(and mu4e~proc-process
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
;; Utility functions used in the mu4e
|
;; Utility functions used in the mu4e
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(eval-when-compile
|
(eval-when-compile
|
||||||
(require 'org nil 'noerror))
|
(require 'org nil 'noerror))
|
||||||
(require 'cl-lib)
|
(require 'cl-lib)
|
||||||
|
@ -49,8 +50,6 @@
|
||||||
(declare-function mu4e-context-vars "mu4e-context")
|
(declare-function mu4e-context-vars "mu4e-context")
|
||||||
(declare-function show-all "org")
|
(declare-function show-all "org")
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; the following is taken from org.el; we copy it here since we don't want to
|
;; the following is taken from org.el; we copy it here since we don't want to
|
||||||
;; depend on org-mode directly (it causes byte-compilation errors) TODO: a
|
;; depend on org-mode directly (it causes byte-compilation errors) TODO: a
|
||||||
;; cleaner solution....
|
;; cleaner solution....
|
||||||
|
@ -80,6 +79,7 @@ NODEFAULT, hour and minute fields will be nil if not given."
|
||||||
nil nil nil)
|
nil nil nil)
|
||||||
(mu4e-error "Not a standard mu4e time string: %s" s)))
|
(mu4e-error "Not a standard mu4e time string: %s" s)))
|
||||||
|
|
||||||
|
;;; Various
|
||||||
|
|
||||||
(defun mu4e-user-mail-address-p (addr)
|
(defun mu4e-user-mail-address-p (addr)
|
||||||
"If ADDR is one of user's e-mail addresses return t, nil otherwise.
|
"If ADDR is one of user's e-mail addresses return t, nil otherwise.
|
||||||
|
@ -90,7 +90,6 @@ insensitive comparison is used."
|
||||||
:test (lambda (s1 s2)
|
:test (lambda (s1 s2)
|
||||||
(eq t (compare-strings s1 nil nil s2 nil nil t)))))
|
(eq t (compare-strings s1 nil nil s2 nil nil t)))))
|
||||||
t))
|
t))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defmacro with~mu4e-context-vars (context &rest body)
|
(defmacro with~mu4e-context-vars (context &rest body)
|
||||||
"Evaluate BODY, with variables let-bound for CONTEXT (if any).
|
"Evaluate BODY, with variables let-bound for CONTEXT (if any).
|
||||||
|
@ -102,7 +101,8 @@ insensitive comparison is used."
|
||||||
(mapcar (lambda(cell) (cdr cell)) vars)
|
(mapcar (lambda(cell) (cdr cell)) vars)
|
||||||
(eval ,@body))))
|
(eval ,@body))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Folders (1/2)
|
||||||
|
|
||||||
;; the standard folders can be functions too
|
;; the standard folders can be functions too
|
||||||
(defun mu4e~get-folder (foldervar msg)
|
(defun mu4e~get-folder (foldervar msg)
|
||||||
"Within the mu-context of MSG, get message folder FOLDERVAR.
|
"Within the mu-context of MSG, get message folder FOLDERVAR.
|
||||||
|
@ -138,16 +138,14 @@ return the result."
|
||||||
(defun mu4e-get-trash-folder (&optional msg)
|
(defun mu4e-get-trash-folder (&optional msg)
|
||||||
"Get the sent folder. See `mu4e-trash-folder'."
|
"Get the sent folder. See `mu4e-trash-folder'."
|
||||||
(mu4e~get-folder 'mu4e-trash-folder msg))
|
(mu4e~get-folder 'mu4e-trash-folder msg))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Self-destructing files
|
||||||
|
|
||||||
(defun mu4e-remove-file-later (filename)
|
(defun mu4e-remove-file-later (filename)
|
||||||
"Remove FILENAME in a few seconds."
|
"Remove FILENAME in a few seconds."
|
||||||
(run-at-time "30 sec" nil
|
(run-at-time "30 sec" nil
|
||||||
(lambda () (ignore-errors (delete-file filename)))))
|
(lambda () (ignore-errors (delete-file filename)))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
(defun mu4e-make-temp-file (ext)
|
(defun mu4e-make-temp-file (ext)
|
||||||
"Create a temporary file with extension EXT. The file will
|
"Create a temporary file with extension EXT. The file will
|
||||||
self-destruct in a few seconds, enough to open it in another
|
self-destruct in a few seconds, enough to open it in another
|
||||||
|
@ -155,12 +153,13 @@ program."
|
||||||
(let ((tmpfile (make-temp-file "mu4e-" nil (concat "." ext))))
|
(let ((tmpfile (make-temp-file "mu4e-" nil (concat "." ext))))
|
||||||
(mu4e-remove-file-later tmpfile)
|
(mu4e-remove-file-later tmpfile)
|
||||||
tmpfile))
|
tmpfile))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; Folders (2/2)
|
||||||
|
;;
|
||||||
|
;; mu4e-attachment-dir is either a string or a function that takes a
|
||||||
|
;; filename and the mime-type as argument, either (or both) which can
|
||||||
|
;; be nil
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; mu4e-attachment-dir is either a string or a function that takes a filename
|
|
||||||
;; and the mime-type as argument, either (or both) which can be nil
|
|
||||||
(defun mu4e~get-attachment-dir (&optional fname mimetype)
|
(defun mu4e~get-attachment-dir (&optional fname mimetype)
|
||||||
"Get the directory for saving attachments from
|
"Get the directory for saving attachments from
|
||||||
`mu4e-attachment-dir' (which can be either a string or a function,
|
`mu4e-attachment-dir' (which can be either a string or a function,
|
||||||
|
@ -177,9 +176,9 @@ see its docstring)."
|
||||||
(if dir
|
(if dir
|
||||||
(expand-file-name dir)
|
(expand-file-name dir)
|
||||||
(mu4e-error (mu4e-error "mu4e-attachment-dir evaluates to nil")))))
|
(mu4e-error (mu4e-error "mu4e-attachment-dir evaluates to nil")))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Maildir (1/2)
|
||||||
|
|
||||||
(defun mu4e~guess-maildir (path)
|
(defun mu4e~guess-maildir (path)
|
||||||
"Guess the maildir for some path, or nil if cannot find it."
|
"Guess the maildir for some path, or nil if cannot find it."
|
||||||
(let ((idx (string-match (mu4e-root-maildir) path)))
|
(let ((idx (string-match (mu4e-root-maildir) path)))
|
||||||
|
@ -189,10 +188,7 @@ see its docstring)."
|
||||||
""
|
""
|
||||||
(expand-file-name
|
(expand-file-name
|
||||||
(concat path "/../.."))))))
|
(concat path "/../.."))))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
(defun mu4e-create-maildir-maybe (dir)
|
(defun mu4e-create-maildir-maybe (dir)
|
||||||
"Offer to create maildir DIR if it does not exist yet.
|
"Offer to create maildir DIR if it does not exist yet.
|
||||||
Return t if the dir already existed, or an attempt has been made to
|
Return t if the dir already existed, or an attempt has been made to
|
||||||
|
@ -207,6 +203,8 @@ an absolute path."
|
||||||
(mu4e~proc-mkdir dir) t)
|
(mu4e~proc-mkdir dir) t)
|
||||||
(t nil)))
|
(t nil)))
|
||||||
|
|
||||||
|
;;; Messages, warnings and errors
|
||||||
|
|
||||||
(defun mu4e-format (frm &rest args)
|
(defun mu4e-format (frm &rest args)
|
||||||
"Create [mu4e]-prefixed string based on format FRM and ARGS."
|
"Create [mu4e]-prefixed string based on format FRM and ARGS."
|
||||||
(concat
|
(concat
|
||||||
|
@ -245,6 +243,8 @@ Does a local-exit and does not return. In emacs versions below
|
||||||
(mu4e-log 'error (apply 'mu4e-format frm args))
|
(mu4e-log 'error (apply 'mu4e-format frm args))
|
||||||
(user-error "%s" (apply 'mu4e-format frm args)))
|
(user-error "%s" (apply 'mu4e-format frm args)))
|
||||||
|
|
||||||
|
;;; Reading user input
|
||||||
|
|
||||||
(defun mu4e~read-char-choice (prompt choices)
|
(defun mu4e~read-char-choice (prompt choices)
|
||||||
"Read and return one of CHOICES, prompting for PROMPT.
|
"Read and return one of CHOICES, prompting for PROMPT.
|
||||||
Any input that is not one of CHOICES is ignored. This mu4e's
|
Any input that is not one of CHOICES is ignored. This mu4e's
|
||||||
|
@ -311,6 +311,8 @@ Function will return the cdr of the list element."
|
||||||
(cdr chosen)
|
(cdr chosen)
|
||||||
(mu4e-warn "Unknown shortcut '%c'" response))))
|
(mu4e-warn "Unknown shortcut '%c'" response))))
|
||||||
|
|
||||||
|
;;; Maildir (1/2)
|
||||||
|
|
||||||
(defun mu4e~get-maildirs-1 (path mdir)
|
(defun mu4e~get-maildirs-1 (path mdir)
|
||||||
"Get maildirs under path, recursively, as a list of relative paths."
|
"Get maildirs under path, recursively, as a list of relative paths."
|
||||||
(let ((dirs)
|
(let ((dirs)
|
||||||
|
@ -395,6 +397,8 @@ and offer to create it if it does not exist yet."
|
||||||
(mu4e~proc-mkdir fullpath)))
|
(mu4e~proc-mkdir fullpath)))
|
||||||
mdir))
|
mdir))
|
||||||
|
|
||||||
|
;;; Bookmarks
|
||||||
|
|
||||||
(defun mu4e-bookmarks ()
|
(defun mu4e-bookmarks ()
|
||||||
"Get `mu4e-bookmarks' in the (new) format, converting from the
|
"Get `mu4e-bookmarks' in the (new) format, converting from the
|
||||||
old format if needed."
|
old format if needed."
|
||||||
|
@ -456,7 +460,8 @@ replaces any existing bookmark with KEY."
|
||||||
mu4e-bookmarks :test 'equal))
|
mu4e-bookmarks :test 'equal))
|
||||||
|
|
||||||
|
|
||||||
;;; converting flags->string and vice-versa ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Converting flags->string and vice-versa
|
||||||
|
|
||||||
(defun mu4e~flags-to-string-raw (flags)
|
(defun mu4e~flags-to-string-raw (flags)
|
||||||
"Convert a list of flags into a string as seen in Maildir
|
"Convert a list of flags into a string as seen in Maildir
|
||||||
message files; flags are symbols draft, flagged, new, passed,
|
message files; flags are symbols draft, flagged, new, passed,
|
||||||
|
@ -517,8 +522,8 @@ letters than the ones listed here are ignored. Also see
|
||||||
http://cr.yp.to/proto/maildir.html "
|
http://cr.yp.to/proto/maildir.html "
|
||||||
;; "Remove duplicates from the output of `mu4e~string-to-flags-1'"
|
;; "Remove duplicates from the output of `mu4e~string-to-flags-1'"
|
||||||
(cl-remove-duplicates (mu4e~string-to-flags-1 str)))
|
(cl-remove-duplicates (mu4e~string-to-flags-1 str)))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; Various
|
||||||
|
|
||||||
(defun mu4e-display-size (size)
|
(defun mu4e-display-size (size)
|
||||||
"Get a string representation of SIZE (in bytes)."
|
"Get a string representation of SIZE (in bytes)."
|
||||||
|
@ -540,7 +545,8 @@ Or go to the top level if there is none."
|
||||||
('mu4e-view-mode "(mu4e)Message view")
|
('mu4e-view-mode "(mu4e)Message view")
|
||||||
(t "mu4e"))))
|
(t "mu4e"))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED Buffers and windows (1/2)
|
||||||
|
|
||||||
(defun mu4e-last-query ()
|
(defun mu4e-last-query ()
|
||||||
"Get the most recent query or nil if there is none."
|
"Get the most recent query or nil if there is none."
|
||||||
(when (buffer-live-p (mu4e-get-headers-buffer))
|
(when (buffer-live-p (mu4e-get-headers-buffer))
|
||||||
|
@ -582,7 +588,8 @@ that has a live window), and vice versa."
|
||||||
(view-mode)))
|
(view-mode)))
|
||||||
(switch-to-buffer buf)))
|
(switch-to-buffer buf)))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defvar mu4e~lists-hash nil
|
(defvar mu4e~lists-hash nil
|
||||||
"Hashtable of mailing-list-id => shortname, based on
|
"Hashtable of mailing-list-id => shortname, based on
|
||||||
`mu4e~mailing-lists' and `mu4e-user-mailing-lists'.")
|
`mu4e~mailing-lists' and `mu4e-user-mailing-lists'.")
|
||||||
|
@ -611,7 +618,7 @@ on `mu4e~mailing-lists', `mu4e-user-mailing-lists', and
|
||||||
(match-string 1 list-id)
|
(match-string 1 list-id)
|
||||||
list-id)))
|
list-id)))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defvar mu4e-index-updated-hook nil
|
(defvar mu4e-index-updated-hook nil
|
||||||
"Hook run when the indexing process had one or more updated messages.
|
"Hook run when the indexing process had one or more updated messages.
|
||||||
|
@ -631,8 +638,8 @@ changed.")
|
||||||
(defvar mu4e~contacts-tstamp "0"
|
(defvar mu4e~contacts-tstamp "0"
|
||||||
"Timestamp for the most recent contacts update." )
|
"Timestamp for the most recent contacts update." )
|
||||||
|
|
||||||
;; some handler functions for server messages
|
;;; Some handler functions for server messages
|
||||||
;;
|
|
||||||
(defun mu4e-info-handler (info)
|
(defun mu4e-info-handler (info)
|
||||||
"Handler function for (:info ...) sexps received from the server
|
"Handler function for (:info ...) sexps received from the server
|
||||||
process."
|
process."
|
||||||
|
@ -665,10 +672,9 @@ process."
|
||||||
(cl-case errcode
|
(cl-case errcode
|
||||||
(4 (user-error "No matches for this search query."))
|
(4 (user-error "No matches for this search query."))
|
||||||
(t (error "Error %d: %s" errcode errmsg))))
|
(t (error "Error %d: %s" errcode errmsg))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~update-contacts (contacts &optional tstamp)
|
(defun mu4e~update-contacts (contacts &optional tstamp)
|
||||||
"Receive a sorted list of CONTACTS.
|
"Receive a sorted list of CONTACTS.
|
||||||
|
@ -749,10 +755,8 @@ completion; for testing/debugging."
|
||||||
Checks whether the server process is live."
|
Checks whether the server process is live."
|
||||||
(mu4e~proc-running-p))
|
(mu4e~proc-running-p))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Starting / getting mail / updating the index
|
||||||
;; starting / getting mail / updating the index
|
|
||||||
;;
|
|
||||||
;;
|
|
||||||
(defvar mu4e~update-timer nil
|
(defvar mu4e~update-timer nil
|
||||||
"The mu4e update timer.")
|
"The mu4e update timer.")
|
||||||
(defconst mu4e~update-name " *mu4e-update*"
|
(defconst mu4e~update-name " *mu4e-update*"
|
||||||
|
@ -847,6 +851,7 @@ When successful, call FUNC (if non-nil) afterwards."
|
||||||
(buffer-list)))
|
(buffer-list)))
|
||||||
|
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defvar mu4e~progress-reporter nil
|
(defvar mu4e~progress-reporter nil
|
||||||
"Internal, the progress reporter object.")
|
"Internal, the progress reporter object.")
|
||||||
|
@ -992,12 +997,10 @@ in the background; otherwise, pop up a window."
|
||||||
|
|
||||||
(define-obsolete-function-alias 'mu4e-interrupt-update-mail
|
(define-obsolete-function-alias 'mu4e-interrupt-update-mail
|
||||||
'mu4e-kill-update-mail)
|
'mu4e-kill-update-mail)
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Logging / debugging
|
||||||
;; logging / debugging
|
|
||||||
(defvar mu4e~log-max-lines 1200
|
(defvar mu4e~log-max-lines 1200
|
||||||
"*internal* Last <n> number of lines to keep around in the buffer.")
|
"*internal* Last <n> number of lines to keep around in the buffer.")
|
||||||
(defconst mu4e~log-buffer-name "*mu4e-log*"
|
(defconst mu4e~log-buffer-name "*mu4e-log*"
|
||||||
|
@ -1094,8 +1097,7 @@ This includes expanding e.g. 3-5 into 3,4,5. If the letter
|
||||||
(mu4e-warn "Attachment number must be greater than 0 (%d)" x))))
|
(mu4e-warn "Attachment number must be greater than 0 (%d)" x))))
|
||||||
list)))
|
list)))
|
||||||
|
|
||||||
|
;;; UNNAMED
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defvar mu4e-imagemagick-identify "identify"
|
(defvar mu4e-imagemagick-identify "identify"
|
||||||
"Name/path of the Imagemagick 'identify' program.")
|
"Name/path of the Imagemagick 'identify' program.")
|
||||||
|
@ -1152,8 +1154,10 @@ displaying it). Do _not_ bury the current buffer, though."
|
||||||
`parse-time-string'."
|
`parse-time-string'."
|
||||||
(let ((timestr (read-string (mu4e-format "%s" prompt))))
|
(let ((timestr (read-string (mu4e-format "%s" prompt))))
|
||||||
(apply 'encode-time (mu4e-parse-time-string timestr))))
|
(apply 'encode-time (mu4e-parse-time-string timestr))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
;;; Mu4e-org-mode
|
||||||
|
|
||||||
(define-derived-mode mu4e-org-mode org-mode "mu4e:org"
|
(define-derived-mode mu4e-org-mode org-mode "mu4e:org"
|
||||||
"Major mode for mu4e documents, derived from
|
"Major mode for mu4e documents, derived from
|
||||||
`org-mode'.")
|
`org-mode'.")
|
||||||
|
@ -1182,7 +1186,8 @@ displaying it). Do _not_ bury the current buffer, though."
|
||||||
"Show the mu4e 'about' page."
|
"Show the mu4e 'about' page."
|
||||||
(interactive)
|
(interactive)
|
||||||
(mu4e-info (concat mu4e-doc-dir "/NEWS.org")))
|
(mu4e-info (concat mu4e-doc-dir "/NEWS.org")))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e-refresh-message (path)
|
(defun mu4e-refresh-message (path)
|
||||||
"Re-parse message at PATH; if this works, we will
|
"Re-parse message at PATH; if this works, we will
|
||||||
|
@ -1190,7 +1195,8 @@ receive (:info add :path <path> :docid <docid>) as well as (:update
|
||||||
<msg-sexp>)."
|
<msg-sexp>)."
|
||||||
(mu4e~proc-add path))
|
(mu4e~proc-add path))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~fontify-cited ()
|
(defun mu4e~fontify-cited ()
|
||||||
"Colorize message content based on the citation level. This is
|
"Colorize message content based on the citation level. This is
|
||||||
used in the view and compose modes."
|
used in the view and compose modes."
|
||||||
|
@ -1219,7 +1225,8 @@ the view and compose modes and will color each signature in digest messages adhe
|
||||||
(re-search-forward "\\(^-\\{30\\}.*$\\)" nil t) ;; 30 by RFC1153
|
(re-search-forward "\\(^-\\{30\\}.*$\\)" nil t) ;; 30 by RFC1153
|
||||||
(point-max))))
|
(point-max))))
|
||||||
(add-text-properties p end '(face mu4e-footer-face)))))))
|
(add-text-properties p end '(face mu4e-footer-face)))))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
;;; UNNAMED
|
||||||
|
|
||||||
(defun mu4e~quote-for-modeline (str)
|
(defun mu4e~quote-for-modeline (str)
|
||||||
"Quote a string to be used literally in the modeline. The
|
"Quote a string to be used literally in the modeline. The
|
||||||
|
@ -1237,7 +1244,7 @@ string will be shortened to fit if its length exceeds
|
||||||
;; Escape the % character
|
;; Escape the % character
|
||||||
(replace-regexp-in-string "%" "%%" str t t)))
|
(replace-regexp-in-string "%" "%%" str t t)))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; UNNAMED Buffers and windows (1/2)
|
||||||
|
|
||||||
(defun mu4e~active-composition-buffers ()
|
(defun mu4e~active-composition-buffers ()
|
||||||
"Return all active mu4e composition buffers"
|
"Return all active mu4e composition buffers"
|
||||||
|
|
|
@ -24,13 +24,13 @@
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Customization
|
|
||||||
(require 'mu4e-meta)
|
(require 'mu4e-meta)
|
||||||
(require 'message)
|
(require 'message)
|
||||||
|
|
||||||
(declare-function mu4e-error "mu4e-utils")
|
(declare-function mu4e-error "mu4e-utils")
|
||||||
|
|
||||||
|
;;; Customization
|
||||||
|
|
||||||
(defgroup mu4e nil
|
(defgroup mu4e nil
|
||||||
"mu4e - mu for emacs"
|
"mu4e - mu for emacs"
|
||||||
:group 'mail)
|
:group 'mail)
|
||||||
|
@ -314,7 +314,8 @@ Also see `mu4e-compose-context-policy'."
|
||||||
(const :tag "Don't change the context when none match" nil))
|
(const :tag "Don't change the context when none match" nil))
|
||||||
:group 'mu4e)
|
:group 'mu4e)
|
||||||
|
|
||||||
;; crypto
|
;;;; Crypto
|
||||||
|
|
||||||
(defgroup mu4e-crypto nil
|
(defgroup mu4e-crypto nil
|
||||||
"Crypto-related settings."
|
"Crypto-related settings."
|
||||||
:group 'mu4e)
|
:group 'mu4e)
|
||||||
|
@ -335,14 +336,15 @@ The setting is a symbol:
|
||||||
(const :tag "Don't try to decrypt anything" nil))
|
(const :tag "Don't try to decrypt anything" nil))
|
||||||
:group 'mu4e-crypto)
|
:group 'mu4e-crypto)
|
||||||
|
|
||||||
;; completion; we put them here rather than in mu4e-compose, as mu4e-utils needs
|
;;;; Address completion
|
||||||
;; the variables.
|
;;
|
||||||
|
;; We put these options here rather than in mu4e-compose, because
|
||||||
|
;; mu4e-utils needs them.
|
||||||
|
|
||||||
(defgroup mu4e-compose nil
|
(defgroup mu4e-compose nil
|
||||||
"Message-composition related settings."
|
"Message-composition related settings."
|
||||||
:group 'mu4e)
|
:group 'mu4e)
|
||||||
|
|
||||||
;; address completion
|
|
||||||
(defcustom mu4e-compose-complete-addresses t
|
(defcustom mu4e-compose-complete-addresses t
|
||||||
"Whether to do auto-completion of e-mail addresses."
|
"Whether to do auto-completion of e-mail addresses."
|
||||||
:type 'boolean
|
:type 'boolean
|
||||||
|
@ -368,10 +370,10 @@ time-based restriction."
|
||||||
:type 'string
|
:type 'string
|
||||||
:group 'mu4e-compose)
|
:group 'mu4e-compose)
|
||||||
|
|
||||||
;;; names and mail-addresses can be mapped onto their canonical
|
;; names and mail-addresses can be mapped onto their canonical
|
||||||
;;; counterpart. use the customizeable function
|
;; counterpart. use the customizeable function
|
||||||
;;; mu4e-canonical-contact-function to do that. below the identity
|
;; mu4e-canonical-contact-function to do that. below the identity
|
||||||
;;; function for mapping a contact onto the canonical one.
|
;; function for mapping a contact onto the canonical one.
|
||||||
(defun mu4e-contact-identity (contact)
|
(defun mu4e-contact-identity (contact)
|
||||||
"Return the name and the mail-address of a CONTACT.
|
"Return the name and the mail-address of a CONTACT.
|
||||||
It is used as the identity function for converting contacts to
|
It is used as the identity function for converting contacts to
|
||||||
|
@ -447,6 +449,8 @@ Useful when this is not equal to the From: address."
|
||||||
This is the message being replied to, forwarded or edited; used
|
This is the message being replied to, forwarded or edited; used
|
||||||
in `mu4e-compose-pre-hook'. For new messages, it is nil.")
|
in `mu4e-compose-pre-hook'. For new messages, it is nil.")
|
||||||
|
|
||||||
|
;;;; Calendar
|
||||||
|
|
||||||
(defgroup mu4e-icalendar nil
|
(defgroup mu4e-icalendar nil
|
||||||
"Icalendar related settings."
|
"Icalendar related settings."
|
||||||
:group 'mu4e)
|
:group 'mu4e)
|
||||||
|
@ -463,7 +467,8 @@ in `mu4e-compose-pre-hook'. For new messages, it is nil.")
|
||||||
:group 'mu4e-icalendar)
|
:group 'mu4e-icalendar)
|
||||||
|
|
||||||
|
|
||||||
;; Folders
|
;;;; Folders
|
||||||
|
|
||||||
(defgroup mu4e-folders nil
|
(defgroup mu4e-folders nil
|
||||||
"Special folders."
|
"Special folders."
|
||||||
:group 'mu4e)
|
:group 'mu4e)
|
||||||
|
@ -543,7 +548,8 @@ be quoted, since mu4e does this automatically for you."
|
||||||
:group 'mu4e
|
:group 'mu4e
|
||||||
:type 'boolean)
|
:type 'boolean)
|
||||||
|
|
||||||
;; Faces
|
;;; Faces
|
||||||
|
|
||||||
(defgroup mu4e-faces nil
|
(defgroup mu4e-faces nil
|
||||||
"Type faces (fonts) used in mu4e."
|
"Type faces (fonts) used in mu4e."
|
||||||
:group 'mu4e
|
:group 'mu4e
|
||||||
|
@ -739,7 +745,8 @@ mu4e-compose-mode."
|
||||||
"Face for highlighting marked region in mu4e-view buffer."
|
"Face for highlighting marked region in mu4e-view buffer."
|
||||||
:group 'mu4e-faces)
|
:group 'mu4e-faces)
|
||||||
|
|
||||||
;; headers info
|
;;; Header information
|
||||||
|
|
||||||
(defconst mu4e-header-info
|
(defconst mu4e-header-info
|
||||||
'((:attachments
|
'((:attachments
|
||||||
. (:name "Attachments"
|
. (:name "Attachments"
|
||||||
|
@ -888,22 +895,22 @@ should point to a function that takes a message p-list as
|
||||||
argument, and returns a string. See the default value of
|
argument, and returns a string. See the default value of
|
||||||
`mu4e-header-info-custom for an example.")
|
`mu4e-header-info-custom for an example.")
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Run-time variables
|
||||||
|
;;;; Headers
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; run-time vars used in multiple places
|
|
||||||
|
|
||||||
;; headers
|
|
||||||
(defconst mu4e~headers-buffer-name "*mu4e-headers*"
|
(defconst mu4e~headers-buffer-name "*mu4e-headers*"
|
||||||
"Name of the buffer for message headers.")
|
"Name of the buffer for message headers.")
|
||||||
|
|
||||||
;; view
|
;;;; View
|
||||||
|
|
||||||
(defconst mu4e~view-buffer-name "*mu4e-view*"
|
(defconst mu4e~view-buffer-name "*mu4e-view*"
|
||||||
"Name for the message view buffer.")
|
"Name for the message view buffer.")
|
||||||
|
|
||||||
(defconst mu4e~view-embedded-buffer-name " *mu4e-embedded-view*"
|
(defconst mu4e~view-embedded-buffer-name " *mu4e-embedded-view*"
|
||||||
"Name for the embedded message view buffer.")
|
"Name for the embedded message view buffer.")
|
||||||
|
|
||||||
|
;;;; Other
|
||||||
|
|
||||||
(defvar mu4e~contacts nil
|
(defvar mu4e~contacts nil
|
||||||
"Hash that maps contacts (ie. 'name <e-mail>') to an integer for sorting.
|
"Hash that maps contacts (ie. 'name <e-mail>') to an integer for sorting.
|
||||||
We need to keep this information around to quickly re-sort
|
We need to keep this information around to quickly re-sort
|
||||||
|
@ -947,20 +954,20 @@ fall back to the obsolete `mu4e-user-mail-address-list'."
|
||||||
version))
|
version))
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Handler functions
|
||||||
;; our handlers funcs these handler funcs define what happens when we receive a
|
;;
|
||||||
;; certain message from the server
|
;; The handler funcions define what happens when we receive a certain
|
||||||
|
;; message from the server. Here we register our handler functions;
|
||||||
|
;; these connect server messages to functions to handle them.
|
||||||
|
;;
|
||||||
|
;; These bindings form mu4e's central nervous system so it's not
|
||||||
|
;; really recommended to override them (they reference various
|
||||||
|
;; internal bits, which could change).
|
||||||
|
|
||||||
(defun mu4e~default-handler (&rest args)
|
(defun mu4e~default-handler (&rest args)
|
||||||
"Dummy handler function with arbitrary ARGS."
|
"Dummy handler function with arbitrary ARGS."
|
||||||
(error "Not handled: %S" args))
|
(error "Not handled: %S" args))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; register our handler functions; these connect server messages to functions
|
|
||||||
;; to handle them.
|
|
||||||
;;
|
|
||||||
;; these form mu4e's central nervous system so it's not really recommended
|
|
||||||
;; to override them (they reference various internal bits which could change)
|
|
||||||
|
|
||||||
(defvar mu4e-error-func 'mu4e-error-handler
|
(defvar mu4e-error-func 'mu4e-error-handler
|
||||||
"Function called for each error received.
|
"Function called for each error received.
|
||||||
The function is passed an error plist as argument. See
|
The function is passed an error plist as argument. See
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
;; viewing e-mail messages
|
;; viewing e-mail messages
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(require 'cl-lib)
|
(require 'cl-lib)
|
||||||
(require 'mu4e-utils) ;; utility functions
|
(require 'mu4e-utils) ;; utility functions
|
||||||
(require 'mu4e-vars)
|
(require 'mu4e-vars)
|
||||||
|
@ -48,7 +49,8 @@
|
||||||
(defvar gnus-icalendar-additional-identities)
|
(defvar gnus-icalendar-additional-identities)
|
||||||
(defvar mu4e~headers-view-win)
|
(defvar mu4e~headers-view-win)
|
||||||
|
|
||||||
;; the message view
|
;;; Options
|
||||||
|
|
||||||
(defgroup mu4e-view nil
|
(defgroup mu4e-view nil
|
||||||
"Settings for the message view."
|
"Settings for the message view."
|
||||||
:group 'mu4e)
|
:group 'mu4e)
|
||||||
|
@ -149,12 +151,16 @@ The first letter of NAME is used as a shortcut character."
|
||||||
:group 'mu4e-view
|
:group 'mu4e-view
|
||||||
:type '(alist :key-type string :value-type function))
|
:type '(alist :key-type string :value-type function))
|
||||||
|
|
||||||
|
;;; Variables
|
||||||
|
|
||||||
(defvar-local mu4e~view-message nil
|
(defvar-local mu4e~view-message nil
|
||||||
"The message being viewed in view mode.")
|
"The message being viewed in view mode.")
|
||||||
|
|
||||||
(defvar mu4e-view-fill-headers t
|
(defvar mu4e-view-fill-headers t
|
||||||
"If non-nil, automatically fill the headers when viewing them.")
|
"If non-nil, automatically fill the headers when viewing them.")
|
||||||
|
|
||||||
|
;;; Keymaps
|
||||||
|
|
||||||
(defvar mu4e-view-header-field-keymap
|
(defvar mu4e-view-header-field-keymap
|
||||||
(let ((map (make-sparse-keymap)))
|
(let ((map (make-sparse-keymap)))
|
||||||
(define-key map [mouse-1] 'mu4e~view-header-field-fold)
|
(define-key map [mouse-1] 'mu4e~view-header-field-fold)
|
||||||
|
@ -193,7 +199,8 @@ off, for example when using a read-only file-system."
|
||||||
:type 'boolean
|
:type 'boolean
|
||||||
:group 'mu4e-view)
|
:group 'mu4e-view)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Variables
|
||||||
|
|
||||||
(defvar mu4e~view-cited-hidden nil "Whether cited lines are hidden.")
|
(defvar mu4e~view-cited-hidden nil "Whether cited lines are hidden.")
|
||||||
(put 'mu4e~view-cited-hidden 'permanent-local t)
|
(put 'mu4e~view-cited-hidden 'permanent-local t)
|
||||||
|
|
||||||
|
@ -216,7 +223,8 @@ message extracted at some path.")
|
||||||
(defvar mu4e~view-html-text nil
|
(defvar mu4e~view-html-text nil
|
||||||
"Should we prefer html or text just this once? A symbol `text'
|
"Should we prefer html or text just this once? A symbol `text'
|
||||||
or `html' or nil.")
|
or `html' or nil.")
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
;;; UNNAMED Main
|
||||||
|
|
||||||
(defun mu4e-view-message-with-message-id (msgid)
|
(defun mu4e-view-message-with-message-id (msgid)
|
||||||
"View message with message-id MSGID. This (re)creates a
|
"View message with message-id MSGID. This (re)creates a
|
||||||
|
@ -1082,9 +1090,8 @@ the new docid. Otherwise, return nil."
|
||||||
(interactive)
|
(interactive)
|
||||||
(mu4e~view-prev-or-next-unread nil))
|
(mu4e~view-prev-or-next-unread nil))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
;; Interactive functions
|
;;; Interactive functions
|
||||||
|
|
||||||
(defun mu4e-view-toggle-hide-cited ()
|
(defun mu4e-view-toggle-hide-cited ()
|
||||||
"Toggle hiding of cited lines in the message body."
|
"Toggle hiding of cited lines in the message body."
|
||||||
|
@ -1180,8 +1187,8 @@ Add this function to `mu4e-view-mode-hook' to enable this feature."
|
||||||
(overlay-put ov 'face 'mu4e-region-code))
|
(overlay-put ov 'face 'mu4e-region-code))
|
||||||
(setq beg nil end nil))))))
|
(setq beg nil end nil))))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Wash functions
|
||||||
;; Wash functions
|
|
||||||
(defun mu4e-view-fill-long-lines ()
|
(defun mu4e-view-fill-long-lines ()
|
||||||
"Fill lines that are wider than the window width or `fill-column'."
|
"Fill lines that are wider than the window width or `fill-column'."
|
||||||
(interactive)
|
(interactive)
|
||||||
|
@ -1202,8 +1209,8 @@ Add this function to `mu4e-view-mode-hook' to enable this feature."
|
||||||
(widen))
|
(widen))
|
||||||
(forward-line 1)))))))
|
(forward-line 1)))))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Attachment handling
|
||||||
;; attachment handling
|
|
||||||
(defun mu4e~view-get-attach-num (prompt _msg &optional multi)
|
(defun mu4e~view-get-attach-num (prompt _msg &optional multi)
|
||||||
"Ask the user with PROMPT for an attachment number for MSG, and
|
"Ask the user with PROMPT for an attachment number for MSG, and
|
||||||
ensure it is valid. The number is [1..n] for attachments
|
ensure it is valid. The number is [1..n] for attachments
|
||||||
|
@ -1433,7 +1440,8 @@ attachments) in response to a (mu4e~proc-extract 'temp ... )."
|
||||||
((string= what "diary")
|
((string= what "diary")
|
||||||
(icalendar-import-file path diary-file))
|
(icalendar-import-file path diary-file))
|
||||||
(t (mu4e-error "Unsupported action %S" what))))
|
(t (mu4e-error "Unsupported action %S" what))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
;;; UNNAMED Utilities
|
||||||
|
|
||||||
(defun mu4e-view-mark-custom ()
|
(defun mu4e-view-mark-custom ()
|
||||||
"Run some custom mark function."
|
"Run some custom mark function."
|
||||||
|
@ -1444,6 +1452,8 @@ attachments) in response to a (mu4e~proc-extract 'temp ... )."
|
||||||
"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)))
|
||||||
|
|
||||||
|
;;; Scroll commands
|
||||||
|
|
||||||
(defun mu4e-view-scroll-up-or-next ()
|
(defun mu4e-view-scroll-up-or-next ()
|
||||||
"Scroll-up the current message.
|
"Scroll-up the current message.
|
||||||
If `mu4e-view-scroll-to-next' is non-nil, and we can't scroll-up
|
If `mu4e-view-scroll-to-next' is non-nil, and we can't scroll-up
|
||||||
|
@ -1465,6 +1475,8 @@ anymore, go the next message."
|
||||||
(interactive)
|
(interactive)
|
||||||
(scroll-down 1))
|
(scroll-down 1))
|
||||||
|
|
||||||
|
;;; Mark commands
|
||||||
|
|
||||||
(defun mu4e-view-unmark-all ()
|
(defun mu4e-view-unmark-all ()
|
||||||
"If we're in split-view, unmark all messages.
|
"If we're in split-view, unmark all messages.
|
||||||
Otherwise, warn user that unmarking only works in the header
|
Otherwise, warn user that unmarking only works in the header
|
||||||
|
@ -1519,8 +1531,8 @@ list."
|
||||||
(mu4e-headers-mark-or-move-to-trash)
|
(mu4e-headers-mark-or-move-to-trash)
|
||||||
(mu4e~headers-move (or n 1))))
|
(mu4e~headers-move (or n 1))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; URL handling
|
||||||
;; URL handling
|
|
||||||
(defun mu4e~view-get-urls-num (prompt &optional multi)
|
(defun mu4e~view-get-urls-num (prompt &optional multi)
|
||||||
"Ask the user with PROMPT for an URL number for MSG, and ensure
|
"Ask the user with PROMPT for an URL number for MSG, and ensure
|
||||||
it is valid. The number is [1..n] for URLs \[0..(n-1)] in the
|
it is valid. The number is [1..n] for URLs \[0..(n-1)] in the
|
||||||
|
@ -1605,7 +1617,7 @@ this is the default, you may not need it."
|
||||||
"Evaluate FUNC(uri) for each uri in the current message."
|
"Evaluate FUNC(uri) for each uri in the current message."
|
||||||
(maphash (lambda (_num uri) (funcall func uri)) mu4e~view-link-map))
|
(maphash (lambda (_num uri) (funcall func uri)) mu4e~view-link-map))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Various commands
|
||||||
|
|
||||||
(defconst mu4e~view-raw-buffer-name " *mu4e-raw-view*"
|
(defconst mu4e~view-raw-buffer-name " *mu4e-raw-view*"
|
||||||
"Name for the raw message view buffer.")
|
"Name for the raw message view buffer.")
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(require 'mu4e-vars)
|
(require 'mu4e-vars)
|
||||||
(require 'mu4e-headers) ;; headers view
|
(require 'mu4e-headers) ;; headers view
|
||||||
(require 'mu4e-view) ;; message view
|
(require 'mu4e-view) ;; message view
|
||||||
|
@ -39,15 +40,12 @@
|
||||||
(when mu4e-org-support
|
(when mu4e-org-support
|
||||||
(require 'mu4e-org)) ;; support for org-mode links
|
(require 'mu4e-org)) ;; support for org-mode links
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; We can't properly use compose buffers that are revived using
|
||||||
;; we can't properly use compose buffers that are revived using
|
;; desktop-save-mode; so let's turn that off.
|
||||||
;; desktop-save-mode; so let's turn that off
|
|
||||||
(require 'desktop)
|
(require 'desktop)
|
||||||
(add-to-list 'desktop-modes-not-to-save 'mu4e-compose-mode)
|
(add-to-list 'desktop-modes-not-to-save 'mu4e-compose-mode)
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
(defun mu4e (&optional background)
|
(defun mu4e (&optional background)
|
||||||
"If mu4e is not running yet, start it. Then, show the main
|
"If mu4e is not running yet, start it. Then, show the main
|
||||||
|
|
|
@ -27,9 +27,10 @@
|
||||||
;; Support for links to mu4e messages/queries from within org-mode,
|
;; Support for links to mu4e messages/queries from within org-mode,
|
||||||
;; and for writing message in org-mode, sending them as rich-text.
|
;; and for writing message in org-mode, sending them as rich-text.
|
||||||
|
|
||||||
|
;; At least version 8.x of Org mode is required.
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
;; The expect version here is org 8.x
|
|
||||||
(require 'org)
|
(require 'org)
|
||||||
(require 'mu4e-compose)
|
(require 'mu4e-compose)
|
||||||
|
|
||||||
|
@ -41,16 +42,15 @@
|
||||||
(declare-function mu4e-message "mu4e-message")
|
(declare-function mu4e-message "mu4e-message")
|
||||||
(declare-function mu4e-compose-mode "mu4e-compose")
|
(declare-function mu4e-compose-mode "mu4e-compose")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;; editing with org-mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; Editing with org-mode
|
||||||
|
;;
|
||||||
;; below, some functions for the org->html conversion
|
;; below, some functions for the org->html conversion
|
||||||
;; based on / inspired by Eric Schulte's org-mime.el
|
;; based on / inspired by Eric Schulte's org-mime.el
|
||||||
;; Homepage: http://orgmode.org/worg/org-contrib/org-mime.php
|
;; Homepage: http://orgmode.org/worg/org-contrib/org-mime.php
|
||||||
;;
|
;;
|
||||||
;; EXPERIMENTAL
|
;; EXPERIMENTAL
|
||||||
|
|
||||||
(defvar org-export-skip-text-before-1st-heading)
|
(defvar org-export-skip-text-before-1st-heading)
|
||||||
(defvar org-export-htmlize-output-type)
|
(defvar org-export-htmlize-output-type)
|
||||||
(defvar org-export-preserve-breaks)
|
(defvar org-export-preserve-breaks)
|
||||||
|
|
Loading…
Reference in New Issue