org-mu4e: fix org linking
And some whitespace / flycheck cleanups.
This commit is contained in:
117
mu4e/org-mu4e.el
117
mu4e/org-mu4e.el
@ -2,7 +2,7 @@
|
|||||||
;;; org-mode, and for writing message in org-mode, sending them as
|
;;; org-mode, and for writing message in org-mode, sending them as
|
||||||
;;; rich-text
|
;;; rich-text
|
||||||
;;
|
;;
|
||||||
;; Copyright (C) 2012-2016 Dirk-Jan C. Binnema
|
;; Copyright (C) 2012-2019 Dirk-Jan C. Binnema
|
||||||
|
|
||||||
;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||||
;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||||
@ -31,19 +31,29 @@
|
|||||||
;; The expect version here is org 8.x
|
;; The expect version here is org 8.x
|
||||||
(require 'org)
|
(require 'org)
|
||||||
|
|
||||||
|
(declare-function mu4e-last-query "mu4e-headers")
|
||||||
|
(declare-function mu4e-message-at-point "mu4e-message")
|
||||||
|
(declare-function mu4e-view-message-with-message-id "mu4e-view")
|
||||||
|
(declare-function mu4e-headers-search "mu4e-headers")
|
||||||
|
(declare-function mu4e-error "mu4e-utils")
|
||||||
|
(declare-function mu4e-message "mu4e-message")
|
||||||
|
(declare-function mu4e-compose-mode "mu4e-compose")
|
||||||
|
|
||||||
|
|
||||||
(defgroup org-mu4e nil
|
(defgroup org-mu4e nil
|
||||||
"Settings for the org-mode related functionality in mu4e."
|
"Settings for the org-mode related functionality in mu4e."
|
||||||
:group 'mu4e
|
:group 'mu4e
|
||||||
:group 'org)
|
:group 'org)
|
||||||
|
|
||||||
(defvar org-mu4e-link-query-in-headers-mode nil
|
(defvar org-mu4e-link-query-in-headers-mode nil
|
||||||
"If non-nil, `org-store-link' in `mu4e-headers-mode' links to the
|
"Prefer linking to the query rather than to the message.
|
||||||
|
If non-nil, `org-store-link' in `mu4e-headers-mode' links to the
|
||||||
the current query; otherwise, it links to the message at point.")
|
the current query; otherwise, it links to the message at point.")
|
||||||
|
|
||||||
(defcustom org-mu4e-link-desc-func
|
(defcustom org-mu4e-link-desc-func
|
||||||
(lambda (msg) (or (plist-get msg :subject) "No subject"))
|
(lambda (msg) (or (plist-get msg :subject) "No subject"))
|
||||||
"Function that takes a msg and returns a string for the
|
"Function that takes a msg and returns a description.
|
||||||
description part of an org-mode link.
|
This can be use in org capture templates.
|
||||||
|
|
||||||
Example usage:
|
Example usage:
|
||||||
|
|
||||||
@ -62,47 +72,45 @@ Example usage:
|
|||||||
(defun org~mu4e-store-link-query ()
|
(defun org~mu4e-store-link-query ()
|
||||||
"Store a link to a mu4e query."
|
"Store a link to a mu4e query."
|
||||||
(let* ((query (mu4e-last-query))
|
(let* ((query (mu4e-last-query))
|
||||||
desc link)
|
(date (format-time-string (org-time-stamp-format)))
|
||||||
(org-store-link-props :type "mu4e" :query query)
|
;; seems we get an error when there's no date...
|
||||||
(setq
|
(link (concat "mu4e:query:" query)))
|
||||||
desc (concat "mu4e:query:" query)
|
(org-store-link-props
|
||||||
link desc)
|
:type "mu4e"
|
||||||
(org-add-link-props :link link :description desc)
|
:query query
|
||||||
|
:date date)
|
||||||
|
(org-add-link-props
|
||||||
|
:link link
|
||||||
|
:description (format "mu4e-query: '%s'" query))
|
||||||
link))
|
link))
|
||||||
|
|
||||||
|
(defun org~mu4e-first-address (msg field)
|
||||||
|
"Get address field FIELD from MSG as a string or nil."
|
||||||
|
(let* ((val (plist-get msg field))
|
||||||
|
(name (when val (car (car val))))
|
||||||
|
(addr (when val (cdr (car val)))))
|
||||||
|
(when val
|
||||||
|
(if name
|
||||||
|
(format "%s <%s>" name addr)
|
||||||
|
(format "%s" addr)))))
|
||||||
|
|
||||||
(defun org~mu4e-store-link-message ()
|
(defun org~mu4e-store-link-message ()
|
||||||
"Store a link to a mu4e message."
|
"Store a link to a mu4e message."
|
||||||
(let* ((msg (mu4e-message-at-point))
|
(let* ((msg (mu4e-message-at-point))
|
||||||
(msgid (or (plist-get msg :message-id) "<none>"))
|
(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 (plist-get msg :date))
|
||||||
(date-ts (format-time-string (org-time-stamp-format t) date))
|
(date (format-time-string (org-time-stamp-format) date))
|
||||||
(date-ts-ia (format-time-string (org-time-stamp-format t t) date))
|
;; seems we get an error when there's no date...
|
||||||
(subject (or (plist-get msg :subject) "<none>"))
|
(link (concat "mu4e:msgid:" msgid)))
|
||||||
link)
|
(org-store-link-props
|
||||||
(org-store-link-props :type "mu4e" :link link
|
:type "mu4e"
|
||||||
:message-id msgid)
|
:message-id msgid
|
||||||
(setq link (concat "mu4e:msgid:" msgid))
|
:to (org~mu4e-first-address msg :to)
|
||||||
(org-add-link-props :link link
|
:from (org~mu4e-first-address msg :from)
|
||||||
:to (format "%s <%s>" toname toaddress)
|
:date date
|
||||||
:toname toname
|
:subject (plist-get msg :subject))
|
||||||
:toaddress toaddress
|
(org-add-link-props
|
||||||
:from (format "%s <%s>" fromname fromaddress)
|
:link link
|
||||||
: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))
|
:description (funcall org-mu4e-link-desc-func msg))
|
||||||
link))
|
link))
|
||||||
|
|
||||||
@ -127,21 +135,22 @@ valid even after moving the message around."
|
|||||||
(org-add-link-type "mu4e" 'org-mu4e-open)
|
(org-add-link-type "mu4e" 'org-mu4e-open)
|
||||||
(add-hook 'org-store-link-functions 'org-mu4e-store-link))
|
(add-hook 'org-store-link-functions 'org-mu4e-store-link))
|
||||||
|
|
||||||
(defun org-mu4e-open (path)
|
(defun org-mu4e-open (link)
|
||||||
"Open the mu4e message (for paths starting with 'msgid:') or run
|
"Open the org LINK.
|
||||||
the query (for paths starting with 'query:')."
|
Open the mu4e message (for links starting with 'msgid:') or run
|
||||||
|
the query (for links starting with 'query:')."
|
||||||
(require 'mu4e)
|
(require 'mu4e)
|
||||||
(cond
|
(cond
|
||||||
((string-match "^msgid:\\(.+\\)" path)
|
((string-match "^msgid:\\(.+\\)" link)
|
||||||
(mu4e-view-message-with-message-id (match-string 1 path)))
|
(mu4e-view-message-with-message-id (match-string 1 link)))
|
||||||
((string-match "^query:\\(.+\\)" path)
|
((string-match "^query:\\(.+\\)" link)
|
||||||
(mu4e-headers-search (match-string 1 path) current-prefix-arg))
|
(mu4e-headers-search (match-string 1 link) current-prefix-arg))
|
||||||
(t (mu4e-error "mu4e: unrecognized link type '%s'" path))))
|
(t (mu4e-error "Unrecognized link type '%s'" link))))
|
||||||
|
|
||||||
(defun org-mu4e-store-and-capture ()
|
(defun org-mu4e-store-and-capture ()
|
||||||
"Store a link to the current message or query (depending on
|
"Store a link to the current message or query.
|
||||||
`org-mu4e-link-query-in-headers-mode', and capture it with
|
\(depending on `org-mu4e-link-query-in-headers-mode', and capture
|
||||||
org-mode)."
|
it with org)."
|
||||||
(interactive)
|
(interactive)
|
||||||
(call-interactively 'org-store-link)
|
(call-interactively 'org-store-link)
|
||||||
(org-capture))
|
(org-capture))
|
||||||
@ -155,14 +164,14 @@ org-mode)."
|
|||||||
;;
|
;;
|
||||||
;; EXPERIMENTAL
|
;; EXPERIMENTAL
|
||||||
(defun org~mu4e-mime-file (ext path id)
|
(defun org~mu4e-mime-file (ext path id)
|
||||||
"Create a file for an attachment."
|
"Create a file of type EXT at PATH with ID for an attachment."
|
||||||
(format (concat "<#part type=\"%s\" filename=\"%s\" "
|
(format (concat "<#part type=\"%s\" filename=\"%s\" "
|
||||||
"disposition=inline id=\"<%s>\">\n<#/part>\n")
|
"disposition=inline id=\"<%s>\">\n<#/part>\n")
|
||||||
ext path id))
|
ext path id))
|
||||||
|
|
||||||
(defun org~mu4e-mime-multipart (plain html &optional images)
|
(defun org~mu4e-mime-multipart (plain html &optional images)
|
||||||
"Create a multipart/alternative with text/plain and text/html alternatives.
|
"Create a multipart/alternative with PLAIN and HTML alternatives.
|
||||||
If the html portion of the message includes images, wrap the html
|
If the html portion of the message includes IMAGES, wrap the html
|
||||||
and images in a multipart/related part."
|
and images in a multipart/related part."
|
||||||
(concat "<#multipart type=alternative><#part type=text/plain>"
|
(concat "<#multipart type=alternative><#part type=text/plain>"
|
||||||
plain
|
plain
|
||||||
@ -174,7 +183,7 @@ and images in a multipart/related part."
|
|||||||
"<#/multipart>\n"))
|
"<#/multipart>\n"))
|
||||||
|
|
||||||
(defun org~mu4e-mime-replace-images (str current-file)
|
(defun org~mu4e-mime-replace-images (str current-file)
|
||||||
"Replace images in html files with cid links."
|
"Replace images in html files STR in CURRENT-FILE with cid links."
|
||||||
(let (html-images)
|
(let (html-images)
|
||||||
(cons
|
(cons
|
||||||
(replace-regexp-in-string ;; replace images in html
|
(replace-regexp-in-string ;; replace images in html
|
||||||
@ -198,7 +207,7 @@ and images in a multipart/related part."
|
|||||||
(defun org~mu4e-mime-convert-to-html ()
|
(defun org~mu4e-mime-convert-to-html ()
|
||||||
"Convert the current body to html."
|
"Convert the current body to html."
|
||||||
(unless (fboundp 'org-export-string-as)
|
(unless (fboundp 'org-export-string-as)
|
||||||
(mu4e-error "require function 'org-export-string-as not found"))
|
(mu4e-error "Required function 'org-export-string-as not found"))
|
||||||
(let* ((begin
|
(let* ((begin
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(goto-char (point-min))
|
(goto-char (point-min))
|
||||||
|
|||||||
Reference in New Issue
Block a user