From: Tim Visher <tim.visher@gmail.com>
To: Emacs Org Mode mailing list <emacs-orgmode@gnu.org>
Subject: [PATCH]: Add elisp snippet to worg/org-contrib/org-mac.org
Date: Sun, 2 May 2021 16:53:01 -0400 [thread overview]
Message-ID: <CAHa53uyA-CAt1SEw56KfUOVSvsA9T_LqjaG=7j+2suRQsObkew@mail.gmail.com> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 6859 bytes --]
Hello,
At the recommendation of Tim Cross
<https://lists.gnu.org/archive/html/emacs-orgmode/2021-04/msg00813.html> I've
prepared a patch to worg to include the elisp that I recently sent to the
list that I've been using to create TODO items based on the currently
selected macOS Mail.app message.
Let me know if there's anything I can do to help get it applied.
From d1a7818593aee6bcb6de5c6837c506905a64f723 Mon Sep 17 00:00:00 2001
From: Tim Visher <tim@stitchdata.com> <tim%40stitchdata.com>
Date: Sun, 2 May 2021 16:34:24 -0400
Subject: [PATCH] org-mac: Add org-mac-mail-link section and elisp
---
org-contrib/org-mac-mail-link.org | 147 ++++++++++++++++++++++++++++++
org-mac.org | 5 +
2 files changed, 152 insertions(+)
create mode 100644 org-contrib/org-mac-mail-link.org
diff --git a/org-contrib/org-mac-mail-link.org
b/org-contrib/org-mac-mail-link.orgnew file mode 100644index
00000000..6e7f9c52--- /dev/null+++
b/org-contrib/org-mac-mail-link.org@@ -0,0 +1,147 @@+#+TITLE:
org-mac-mail-link.el -- Create and handle links to the selected
Mail.app message+#+OPTIONS: ^:{} author:Tim Visher+#+STARTUP: odd++#
This file is released by its authors and contributors under the GNU+#
Free Documentation license v1.3 or later, code examples are released+#
under the GNU General Public License v3 or
later.++[[file:index.org][{Back to Worg's contibutions index}]]++*
Overview++ This code will allow you to capture a TODO item based on
the+ currently selected Mail.app message using =org-capture=.++*
Installation++ You should simply copy the source code from this
document into your+ init file and edit it as you see fit.++* Usage++
Activate =org-capture= however you see fit (=M-x org-capture= works+
just fine) and then whack the keychord you have set up to activate+
the capture template.++* Code++ #+begin_src elisp+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+
;;; Capture template for the currently selected Mail.app message+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++
(defun org-mac-mail-link-get-selected-message-subject+ ()+
(with-temp-buffer+ (call-process+ "osascript" nil t nil+
"-e" "tell application \"Mail\" to get subject of item 1 of
(selection as list)")+ (buffer-substring-no-properties
(point-min) (- (point-max) 1))))++ (defun
org-mac-mail-link-get-selected-message-id+ ()+
(with-temp-buffer+ (call-process+ "osascript" nil t nil+
"-e" "tell application \"Mail\" to get message id of item 1 of
(selection as list)")+ ;; This additional encoding specifically
of =/= is because Mail.app+ ;; claims to be unable to find a
message if it's ID contains unencoded+ ;; slashes.+
(browse-url-url-encode-chars+ (buffer-substring-no-properties
(point-min) (- (point-max) 1))+ "[/]")))++ (defun
org-mac-mail-link-get-link-string+ ()+ (let ((subject
(org-mac-mail-link-get-selected-message-subject))+
(message-id (org-mac-mail-link-get-selected-message-id)))+
(org-link-make-string (format "message:%s" message-id)+
subject)))++ (defun
org-mac-mail-link-get-body-quote-template-element+ ()+ (let
((body (setq body (with-temp-buffer+
(call-process+ "osascript" nil t nil+
"-e" "tell application \"Mail\" to get
content of item 1 of (selection as list)")+
(buffer-substring-no-properties (point-min) (- (point-max) 1))))))+
(format "++ ,#+begin_quote+ %s+ ,#+end_quote"+
(string-join+ ;; Remove duplicate empty lines+
(seq-reduce+ (lambda (acc next)+
(if (string= next (or (car (last acc)) ""))+ acc+
(append acc (list next))))+ ;;
Indent each line by two spaces for inclusion in the quote+
(mapcar (lambda (string)+ (let ((string
(string-trim string)))+ (if (string= ""
string)+ string+
(format " %s" string))))+ (split-string
body "\n"))+ '())+ "\n"))))++ (require
'org-capture)++ ;;; You may also wish to use the Customize interface
for this variable+ ;;; which is quite nice.+ (setq
org-capture-templates+ ;; These 2-item entries are only
necessary if you want to nest the+ ;; capture template under a
keychord.+ '(("t" "TODO")+ ("tc" "TODO Current")+
("tcm" "TODO Current Mail" entry+ ;; If you maintain
your TODO list in a single file this will+ ;; place the
resulting org-capture template expansion under the+ ;;
'Inbox' heading. You may want to modify this.+ ;;+
;; The resulting heading looks something like+ ;;+
;; ** TODO [[message:<encoded messageID>][subject]]+ ;;+
;; [2021-05-02 Sun 16:22]+ ;;+ ;;
#+begin_quote+ ;; Unwrapped+ ;;+ ;;
Body+ ;;+ ;; Text+ ;;
#+end_quote+ (file+headline "~/your-org-todo.org" "Inbox")+
"* TODO %(org-mac-mail-link-get-link-string)++
%U%(org-mac-mail-link-get-body-quote-template-element)" :prepend t
:immediate-finish t)))++
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+
;;; Use =C-c C= as your org-capture keybinding+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++
(eval-after-load 'org+ '(org-defkey org-mode-map (kbd "C-c C")
#'org-capture))++
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+
;;; Teach org about opening message links+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++
(defun org-mac-mail-link-open-link+ (mid _)+ (start-process
"open-link" nil "open" (format "message://%%3C%s%%3E"+
mid)))++ (defun
org-mac-mail-link-add-message-links+ ()+
(org-link-set-parameters+ "message" :follow
#'org-mac-mail-link-open-link))++ (eval-after-load 'org+
'(org-mac-mail-link-add-message-links))++ #+end_srcdiff --git
a/org-mac.org b/org-mac.orgindex 1cb5392b..2addd5f0 100644---
a/org-mac.org+++ b/org-mac.org@@ -33,6 +33,11 @@ applications other
than Emacs...
insert it as a hyperlink at point in an org-mode document. Written
by /Anthony Lander/.
+** org-mac-mail-link -- Hyperlink to messages in Mail.app+ A small
elisp file that addresses linking to Mail.app messages+ directly via
the =org-capture= system. For wider application+ support check out
[[file:org-contrib/org-mac-link.org][org-mac-link]].+
* For use outside Emacs
Push information from the current application into org-mode.--
2.30.1
Cheers!
--
In Christ,
Timmy V.
https://blog.twonegatives.com
http://five.sentenc.es
[-- Attachment #1.2: Type: text/html, Size: 28570 bytes --]
[-- Attachment #2: 0001-org-mac-Add-org-mac-mail-link-section-and-elisp.patch --]
[-- Type: application/octet-stream, Size: 6808 bytes --]
From d1a7818593aee6bcb6de5c6837c506905a64f723 Mon Sep 17 00:00:00 2001
From: Tim Visher <tim@stitchdata.com>
Date: Sun, 2 May 2021 16:34:24 -0400
Subject: [PATCH] org-mac: Add org-mac-mail-link section and elisp
---
org-contrib/org-mac-mail-link.org | 147 ++++++++++++++++++++++++++++++
org-mac.org | 5 +
2 files changed, 152 insertions(+)
create mode 100644 org-contrib/org-mac-mail-link.org
diff --git a/org-contrib/org-mac-mail-link.org b/org-contrib/org-mac-mail-link.org
new file mode 100644
index 00000000..6e7f9c52
--- /dev/null
+++ b/org-contrib/org-mac-mail-link.org
@@ -0,0 +1,147 @@
+#+TITLE: org-mac-mail-link.el -- Create and handle links to the selected Mail.app message
+#+OPTIONS: ^:{} author:Tim Visher
+#+STARTUP: odd
+
+# This file is released by its authors and contributors under the GNU
+# Free Documentation license v1.3 or later, code examples are released
+# under the GNU General Public License v3 or later.
+
+[[file:index.org][{Back to Worg's contibutions index}]]
+
+* Overview
+
+ This code will allow you to capture a TODO item based on the
+ currently selected Mail.app message using =org-capture=.
+
+* Installation
+
+ You should simply copy the source code from this document into your
+ init file and edit it as you see fit.
+
+* Usage
+
+ Activate =org-capture= however you see fit (=M-x org-capture= works
+ just fine) and then whack the keychord you have set up to activate
+ the capture template.
+
+* Code
+
+ #+begin_src elisp
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;;; Capture template for the currently selected Mail.app message
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ (defun org-mac-mail-link-get-selected-message-subject
+ ()
+ (with-temp-buffer
+ (call-process
+ "osascript" nil t nil
+ "-e" "tell application \"Mail\" to get subject of item 1 of (selection as list)")
+ (buffer-substring-no-properties (point-min) (- (point-max) 1))))
+
+ (defun org-mac-mail-link-get-selected-message-id
+ ()
+ (with-temp-buffer
+ (call-process
+ "osascript" nil t nil
+ "-e" "tell application \"Mail\" to get message id of item 1 of (selection as list)")
+ ;; This additional encoding specifically of =/= is because Mail.app
+ ;; claims to be unable to find a message if it's ID contains unencoded
+ ;; slashes.
+ (browse-url-url-encode-chars
+ (buffer-substring-no-properties (point-min) (- (point-max) 1))
+ "[/]")))
+
+ (defun org-mac-mail-link-get-link-string
+ ()
+ (let ((subject (org-mac-mail-link-get-selected-message-subject))
+ (message-id (org-mac-mail-link-get-selected-message-id)))
+ (org-link-make-string (format "message:%s" message-id)
+ subject)))
+
+ (defun org-mac-mail-link-get-body-quote-template-element
+ ()
+ (let ((body (setq body (with-temp-buffer
+ (call-process
+ "osascript" nil t nil
+ "-e" "tell application \"Mail\" to get content of item 1 of (selection as list)")
+ (buffer-substring-no-properties (point-min) (- (point-max) 1))))))
+ (format "
+
+ ,#+begin_quote
+ %s
+ ,#+end_quote"
+ (string-join
+ ;; Remove duplicate empty lines
+ (seq-reduce
+ (lambda (acc next)
+ (if (string= next (or (car (last acc)) ""))
+ acc
+ (append acc (list next))))
+ ;; Indent each line by two spaces for inclusion in the quote
+ (mapcar (lambda (string)
+ (let ((string (string-trim string)))
+ (if (string= "" string)
+ string
+ (format " %s" string))))
+ (split-string body "\n"))
+ '())
+ "\n"))))
+
+ (require 'org-capture)
+
+ ;;; You may also wish to use the Customize interface for this variable
+ ;;; which is quite nice.
+ (setq org-capture-templates
+ ;; These 2-item entries are only necessary if you want to nest the
+ ;; capture template under a keychord.
+ '(("t" "TODO")
+ ("tc" "TODO Current")
+ ("tcm" "TODO Current Mail" entry
+ ;; If you maintain your TODO list in a single file this will
+ ;; place the resulting org-capture template expansion under the
+ ;; 'Inbox' heading. You may want to modify this.
+ ;;
+ ;; The resulting heading looks something like
+ ;;
+ ;; ** TODO [[message:<encoded messageID>][subject]]
+ ;;
+ ;; [2021-05-02 Sun 16:22]
+ ;;
+ ;; #+begin_quote
+ ;; Unwrapped
+ ;;
+ ;; Body
+ ;;
+ ;; Text
+ ;; #+end_quote
+ (file+headline "~/your-org-todo.org" "Inbox")
+ "* TODO %(org-mac-mail-link-get-link-string)
+
+ %U%(org-mac-mail-link-get-body-quote-template-element)" :prepend t :immediate-finish t)))
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;;; Use =C-c C= as your org-capture keybinding
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ (eval-after-load 'org
+ '(org-defkey org-mode-map (kbd "C-c C") #'org-capture))
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;;; Teach org about opening message links
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ (defun org-mac-mail-link-open-link
+ (mid _)
+ (start-process "open-link" nil "open" (format "message://%%3C%s%%3E"
+ mid)))
+
+ (defun org-mac-mail-link-add-message-links
+ ()
+ (org-link-set-parameters
+ "message" :follow #'org-mac-mail-link-open-link))
+
+ (eval-after-load 'org
+ '(org-mac-mail-link-add-message-links))
+
+ #+end_src
diff --git a/org-mac.org b/org-mac.org
index 1cb5392b..2addd5f0 100644
--- a/org-mac.org
+++ b/org-mac.org
@@ -33,6 +33,11 @@ applications other than Emacs...
insert it as a hyperlink at point in an org-mode document. Written
by /Anthony Lander/.
+** org-mac-mail-link -- Hyperlink to messages in Mail.app
+ A small elisp file that addresses linking to Mail.app messages
+ directly via the =org-capture= system. For wider application
+ support check out [[file:org-contrib/org-mac-link.org][org-mac-link]].
+
* For use outside Emacs
Push information from the current application into org-mode.
--
2.30.1
next reply other threads:[~2021-05-02 20:54 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-02 20:53 Tim Visher [this message]
2021-05-03 4:05 ` [PATCH]: Add elisp snippet to worg/org-contrib/org-mac.org Bastien
2021-05-03 12:30 ` Tim Visher
2021-05-03 12:58 ` Bastien
2021-05-03 13:05 ` Tim Visher
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAHa53uyA-CAt1SEw56KfUOVSvsA9T_LqjaG=7j+2suRQsObkew@mail.gmail.com' \
--to=tim.visher@gmail.com \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.