From 87a05adba3b2f4b57f0efb138b0a601d3eb48ade Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 15 Nov 2012 14:49:54 -0500 Subject: [PATCH] emacs: Buttonize mid: links This adds support for RFC 2392 mid: message ID links. --- emacs/notmuch-show.el | 45 +++++++++++++++++++++++++++++++------------ test/emacs-show | 8 +++++++- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el index 49961fbb..5b3e70ee 100644 --- a/emacs/notmuch-show.el +++ b/emacs/notmuch-show.el @@ -1014,23 +1014,44 @@ message at DEPTH in the current thread." "\\)") "The regexp used to match id: links in messages.") +(defvar notmuch-mid-regexp + ;; goto-address-url-regexp matched cid: links, which have the same + ;; grammar as the message ID part of a mid: link. Construct the + ;; regexp using the same technique as goto-address-url-regexp. + (concat "\\\"-parts into buttons for -a corresponding notmuch search." +This also turns id:\"\"-parts and mid: links into +buttons for a corresponding notmuch search." (goto-address-fontify-region start end) (save-excursion - (goto-char start) - (while (re-search-forward notmuch-id-regexp end t) - ;; remove the overlay created by goto-address-mode - (remove-overlays (match-beginning 0) (match-end 0) 'goto-address t) - (make-text-button (match-beginning 0) (match-end 0) - 'action `(lambda (arg) - (notmuch-show ,(match-string-no-properties 0))) - 'follow-link t - 'help-echo "Mouse-1, RET: search for this message" - 'face goto-address-mail-face)))) + (let (links) + (goto-char start) + (while (re-search-forward notmuch-id-regexp end t) + (push (list (match-beginning 0) (match-end 0) + (match-string-no-properties 0)) links)) + (goto-char start) + (while (re-search-forward notmuch-mid-regexp end t) + (let* ((mid-cid (match-string-no-properties 1)) + (mid (save-match-data + (string-match "^[^/]*" mid-cid) + (url-unhex-string (match-string 0 mid-cid))))) + (push (list (match-beginning 0) (match-end 0) + (notmuch-id-to-query mid)) links))) + (dolist (link links) + ;; Remove the overlay created by goto-address-mode + (remove-overlays (first link) (second link) 'goto-address t) + (make-text-button (first link) (second link) + 'action `(lambda (arg) + (notmuch-show ,(third link))) + 'follow-link t + 'help-echo "Mouse-1, RET: search for this message" + 'face goto-address-mail-face))))) ;;;###autoload (defun notmuch-show (thread-id &optional parent-buffer query-context buffer-name) diff --git a/test/emacs-show b/test/emacs-show index e2d7c706..ec3be8b9 100755 --- a/test/emacs-show +++ b/test/emacs-show @@ -125,7 +125,10 @@ id:\"abc \" id:) id: -cid:xxx"' +cid:xxx +mid:abc mid:abc/def +mid:abc%20def +mid:abc. mid:abc, mid:abc;"' test_emacs '(notmuch-show "id:'$gen_msg_id'") (notmuch-test-mark-links) (test-visible-output)' @@ -153,6 +156,9 @@ id:"abc id:) id: cid:xxx +<> <> +<> +<>. <>, <>; EOF test_expect_equal_file OUTPUT EXPECTED