org-mu4e: fix org linking

And some whitespace / flycheck cleanups.
This commit is contained in:
Dirk-Jan C. Binnema
2019-05-26 18:50:14 +03:00
parent 2beb2eda02
commit c30b9fa49e

View File

@ -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))