mu4e: allow linking outside mu4e with org-mu4e-store-link

This should help e.g. mu4e-conversation.
This commit is contained in:
djcb 2019-02-18 07:22:16 +02:00
parent 508d3d4ae5
commit 1b408928c8
1 changed files with 63 additions and 58 deletions

View File

@ -28,7 +28,6 @@
;;; Code:
;; The expect version here is org 8.x
(require 'org)
@ -60,54 +59,63 @@ Example usage:
:type 'function
:group 'org-mu4e)
(defun org~mu4e-store-link-query ()
"Store a link to a mu4e query."
(let* ((query (mu4e-last-query))
desc link)
(org-store-link-props :type "mu4e" :query query)
(setq
desc (concat "mu4e:query:" query)
link desc)
(org-add-link-props :link link :description desc)
link))
(defun org~mu4e-store-link-message ()
"Store a link to a mu4e message."
(let* ((msg (mu4e-message-at-point))
(msgid (or (plist-get msg :message-id) "<none>"))
(from (or (plist-get msg :from) '(("none" . "none"))))
(fromname (car (car from)))
(fromaddress (cdr (car from)))
(to (or (plist-get msg :to) '(("none" . "none"))))
(toname (car (car to)))
(toaddress (cdr (car to)))
(fromto (if (mu4e-user-mail-address-p fromaddress)
(format "to %s <%s>" toname toaddress)
(format "from %s <%s>" fromname fromaddress)))
(date (plist-get msg :date))
(date-ts (format-time-string (org-time-stamp-format t) date))
(date-ts-ia (format-time-string (org-time-stamp-format t t) date))
(subject (or (plist-get msg :subject) "<none>"))
link)
(org-store-link-props :type "mu4e" :link link
:message-id msgid)
(setq link (concat "mu4e:msgid:" msgid))
(org-add-link-props :link link
:to (format "%s <%s>" toname toaddress)
:toname toname
:toaddress toaddress
:from (format "%s <%s>" fromname fromaddress)
:fromname fromname
:fromaddress fromaddress
:fromto fromto
:date date-ts-ia
:date-timestamp date-ts
:date-timestamp-inactive date-ts-ia
:subject subject
:description (funcall org-mu4e-link-desc-func msg))
link))
(defun org-mu4e-store-link ()
"Store a link to a mu4e query or message."
(when (member major-mode '(mu4e-headers-mode mu4e-view-mode))
(if (and (eq major-mode 'mu4e-headers-mode)
org-mu4e-link-query-in-headers-mode)
;; storing links to queries
(let* ((query (mu4e-last-query))
desc link)
(org-store-link-props :type "mu4e" :query query)
(setq
desc (concat "mu4e:query:" query)
link desc)
(org-add-link-props :link link :description desc)
link)
;; storing links to messages
(let* ((msg (mu4e-message-at-point))
(msgid (or (plist-get msg :message-id) "<none>"))
(from (or (plist-get msg :from) '(("none" . "none"))))
(fromname (car (car from)))
(fromaddress (cdr (car from)))
(to (or (plist-get msg :to) '(("none" . "none"))))
(toname (car (car to)))
(toaddress (cdr (car to)))
(fromto (if (mu4e-user-mail-address-p fromaddress)
(format "to %s <%s>" toname toaddress)
(format "from %s <%s>" fromname fromaddress)))
(date (plist-get msg :date))
(date-ts (format-time-string (org-time-stamp-format t) date))
(date-ts-ia (format-time-string (org-time-stamp-format t t) date))
(subject (or (plist-get msg :subject) "<none>"))
link)
(org-store-link-props :type "mu4e" :link link
:message-id msgid)
(setq link (concat "mu4e:msgid:" msgid))
(org-add-link-props :link link
:to (format "%s <%s>" toname toaddress)
:toname toname
:toaddress toaddress
:from (format "%s <%s>" fromname fromaddress)
:fromname fromname
:fromaddress fromaddress
:fromto fromto
:date date-ts-ia
:date-timestamp date-ts
:date-timestamp-inactive date-ts-ia
:subject subject
:description (funcall org-mu4e-link-desc-func msg))
link))))
"Store a link to a mu4e message or query.
It links to the last known query when in `mu4e-headers-mode' with
`org-mu4e-link-query-in-headers-mode' set; otherwise it links to
a specific message, based on its message-id, so that links stay
valid even after moving the message around."
(if (and (eq major-mode 'mu4e-headers-mode)
org-mu4e-link-query-in-headers-mode)
(org~mu4e-store-link-query)
(org~mu4e-store-link-message)))
;; org-add-link-type is obsolete as of org-mode 9.
;; Instead we will use the org-link-set-parameters method
@ -137,7 +145,6 @@ org-mode)."
(call-interactively 'org-store-link)
(org-capture))
;;; editing with org-mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -190,7 +197,7 @@ and images in a multipart/related part."
(defun org~mu4e-mime-convert-to-html ()
"Convert the current body to html."
(unless (fboundp 'org-export-string-as)
(mu4e-error "require function 'org-export-string-as not found."))
(mu4e-error "require function 'org-export-string-as not found"))
(let* ((begin
(save-excursion
(goto-char (point-min))
@ -245,14 +252,13 @@ and images in a multipart/related part."
(remove-overlays (point-min) eoh))))
(defvar org-mu4e-convert-to-html nil
"Whether to do automatic org-mode => html conversion when sending messages.")
"Whether to do automatic `org-mode' => html conversion when sending messages.")
(defun org~mu4e-mime-convert-to-html-maybe ()
"Convert to html if `org-mu4e-convert-to-html' is non-nil.
This function is called when sending a message (from
`message-send-hook') and, if non-nil, will send the message as
the rich-text version of the what is assumed to be an org-mode
body."
`message-send-hook') and, if non-nil, sends the message as the
rich-text version of what is assumed to be an org mode body."
(when org-mu4e-convert-to-html
(mu4e-message "Converting to html")
(org~mu4e-mime-convert-to-html)))
@ -276,7 +282,7 @@ or org-mode (when in the body)."
(org-mode)
(add-hook 'before-save-hook
(lambda ()
(mu4e-error "Switch to mu4e-compose-mode (M-m) before saving."))
(mu4e-error "Switch to mu4e-compose-mode (M-m) before saving"))
nil t)
(org~mu4e-mime-decorate-headers)
(local-set-key (kbd "M-m")
@ -293,10 +299,9 @@ or org-mode (when in the body)."
;; and add the hook
(add-hook 'post-command-hook 'org~mu4e-mime-switch-headers-or-body t t))))
(defun org-mu4e-compose-org-mode ()
"Pseudo-Minor mode for mu4e-compose-mode, to edit the message
body using org-mode."
"Defines a pseudo-minor mode for mu4e-compose-mode.
Edit the message body using org mode. DEPRECATED."
(interactive)
(unless (member major-mode '(org-mode mu4e-compose-mode))
(mu4e-error "Need org-mode or mu4e-compose-mode"))