* mac-message for Growl 2
@ 2013-08-04 20:39 Iain Houston
2013-08-31 14:07 ` Carsten Dominik
0 siblings, 1 reply; 2+ messages in thread
From: Iain Houston @ 2013-08-04 20:39 UTC (permalink / raw)
To: emacs-orgmode
I encountered a few problems with org-mac-mail bundled with emacs 24.3.1; some errors interfacing with Growl (2.1) so the patch below works for me and I wondered whether it would be of use to anyone else.
I adapted the insertion of flagged mail to look at all active mail accounts rather than having to name any particular one.
This is how I use org-mac-message: and below is the patch.
(require 'org)
(load "org-mac-message")
(global-set-key [(shift f10)] (lambda() (interactive)
(progn
(find-file-noselect "~/Dropbox/org/refile.org")
(org-mac-message-insert-flagged "refile.org" "Flagged mail"))))
diff --git a/org-mac-message.el b/org-mac-message.el
index 5df68f5..be2a654 100644
--- a/org-mac-message.el
+++ b/org-mac-message.el
@@ -95,86 +95,89 @@ This will use the command `open' with the message URL."
"return theLinkList as string\n"
"end tell")))
-(defun as-get-flagged-mail ()
- "AppleScript to create links to flagged messages in Mail.app."
- (do-applescript
- (concat
- ;; Is Growl installed?
- "tell application \"System Events\"\n"
- "set growlHelpers to the name of every process whose creator type contains \"GRRR\"\n"
- "if (count of growlHelpers) > 0 then\n"
- "set growlHelperApp to item 1 of growlHelpers\n"
- "else\n"
- "set growlHelperApp to \"\"\n"
- "end if\n"
- "end tell\n"
-
- ;; Get links
- "tell application \"Mail\"\n"
- "set theMailboxes to every mailbox of account \"" org-mac-mail-account "\"\n"
- "set theLinkList to {}\n"
- "repeat with aMailbox in theMailboxes\n"
- "set theSelection to (every message in aMailbox whose flagged status = true)\n"
- "repeat with theMessage in theSelection\n"
- "set theID to message id of theMessage\n"
- "set theSubject to subject of theMessage\n"
- "set theLink to \"message://\" & theID & \"::split::\" & theSubject & \"\n\"\n"
- "copy theLink to end of theLinkList\n"
-
- ;; Report progress through Growl
- ;; This "double tell" idiom is described in detail at
- ;; http://macscripter.net/viewtopic.php?id=24570 The
- ;; script compiler needs static knowledge of the
- ;; growlHelperApp. Hmm, since we're compiling
- ;; on-the-fly here, this is likely to be way less
- ;; portable than I'd hoped. It'll work when the name
- ;; is still "GrowlHelperApp", though.
- "if growlHelperApp is not \"\" then\n"
- "tell application \"GrowlHelperApp\"\n"
- "tell application growlHelperApp\n"
- "set the allNotificationsList to {\"FlaggedMail\"}\n"
- "set the enabledNotificationsList to allNotificationsList\n"
- "register as application \"FlaggedMail\" all notifications allNotificationsList default notifications enabledNotificationsList icon of application \"Mail\"\n"
- "notify with name \"FlaggedMail\" title \"Importing flagged message\" description theSubject application name \"FlaggedMail\"\n"
- "end tell\n"
- "end tell\n"
- "end if\n"
- "end repeat\n"
- "end repeat\n"
- "return theLinkList as string\n"
- "end tell")))
+(defun as-get-flagged-mail ()
+ "AppleScript to create links to flagged messages in all Mail.app accounts"
+ ;; Revised use of Growl interface and no need for variable org-mac-mail-account
+ (do-applescript
+ (concat
+ ;; Is Growl running? Use API as recommended at http://growl.info/documentation/applescript-support.php
+ "tell application \"System Events\"\n"
+ "set growlIsRunning to (count of (every process whose bundle identifier is \"com.Growl.GrowlHelperApp\")) > 0\n"
+ "end tell\n"
+
+ "set theLinkList to {}\n"
+ "set isNotRegisteredToGrowl to true\n"
+ "tell application \"Mail\"\n"
+ "set theAccountList to the name of every account\n"
+ "repeat with theMailAccount in theAccountList\n"
+ "set theMailboxes to every mailbox of account theMailAccount\n"
+ "repeat with aMailbox in theMailboxes\n"
+ "set theSelection to (every message in aMailbox whose flagged status = true)\n"
+ "repeat with theMessage in theSelection\n"
+ "set theID to message id of theMessage\n"
+ "set theSubject to subject of theMessage\n"
+ "set theLink to \"message://\" & theID & \"::split::\" & theSubject & \"\n\"\n"
+ "copy theLink to end of theLinkList\n"
+
+ "if growlIsRunning then\n"
+ "tell application id \"com.Growl.GrowlHelperApp\"\n"
+ "if isNotRegisteredToGrowl then\n"
+ "set the allNotificationsList to {\"FlaggedMail\"}\n"
+ "set the enabledNotificationsList to allNotificationsList\n"
+ "register as application \"FlaggedMail\" all notifications allNotificationsList default notifications enabledNotificationsList icon of application \"Mail\"\n"
+ "set isNotRegisteredToGrowl to false\n"
+ "end if\n"
+ "notify with name \"FlaggedMail\" title \"Importing flagged message\" description theSubject application name \"FlaggedMail\"\n"
+ "end tell\n"
+ "end if\n"
+
+ "end repeat\n"
+ "end repeat\n"
+ "end repeat\n"
+ "end tell\n"
+ "return theLinkList as string\n"
+ ))
+ )
(defun org-mac-message-get-links (&optional select-or-flag)
- "Create links to the messages currently selected or flagged in Mail.app.
+ "Overridden function.
+Create links to the messages currently selected or flagged in Mail.app.
This will use AppleScript to get the message-id and the subject of the
messages in Mail.app and make a link out of it.
When SELECT-OR-FLAG is \"s\", get the selected messages (this is also
the default). When SELECT-OR-FLAG is \"f\", get the flagged messages.
The Org-syntax text will be pushed to the kill ring, and also returned."
- (interactive "sLink to (s)elected or (f)lagged messages: ")
- (setq select-or-flag (or select-or-flag "s"))
- (message "AppleScript: searching mailboxes...")
- (let* ((as-link-list
- (if (string= select-or-flag "s")
- (as-get-selected-mail)
- (if (string= select-or-flag "f")
- (as-get-flagged-mail)
- (error "Please select \"s\" or \"f\""))))
- (link-list
- (mapcar
- (lambda (x) (if (string-match "\\`\"\\(.*\\)\"\\'" x) (setq x (match-string 1 x))) x)
- (split-string as-link-list "[\r\n]+")))
- split-link URL description orglink orglink-insert rtn orglink-list)
- (while link-list
- (setq split-link (split-string (pop link-list) "::split::"))
- (setq URL (car split-link))
- (setq description (cadr split-link))
- (when (not (string= URL ""))
- (setq orglink (org-make-link-string URL description))
- (push orglink orglink-list)))
- (setq rtn (mapconcat 'identity orglink-list "\n"))
- (kill-new rtn)
- rtn))
+ (interactive "sLink to (s)elected or (f)lagged messages: ")
+ (setq select-or-flag (or select-or-flag "s"))
+ (let* ((as-link-list
+ (if (string= select-or-flag "s")
+ (progn
+ (message "AppleScript: searching mailboxes for selected message")
+ (as-get-selected-mail))
+ (if (string= select-or-flag "f")
+ (progn
+ ;; searching for all flagged messages can take tens of seconds
+ ;; so user needs to be told of progress even if Growl is also notifying
+ (message "AppleScript: searching mailboxes for flagged messages")
+ (as-get-flagged-mail))
+ (error "Please select \"s\" or \"f\""))))
+ (link-list
+ (mapcar
+ (lambda (x) (if (string-match "\\`\"\\(.*\\)\"\\'" x) (setq x (match-string 1 x))) x)
+ (split-string as-link-list "[\r\n]+")))
+ split-link URL description orglink orglink-insert rtn orglink-list)
+ (while link-list
+ (setq split-link (split-string (pop link-list) "::split::"))
+ (setq URL (car split-link))
+ (setq description (cadr split-link))
+ (when (not (string= URL ""))
+ (setq orglink (org-make-link-string URL description))
+ (push orglink orglink-list)))
+ (setq rtn (mapconcat 'identity orglink-list "\n"))
+ (kill-new rtn)
+ ;; "searching" message will remain in echo area until replaced
+ (message "AppleScript: finished searching mailboxes.")
+ rtn))
(defun org-mac-message-insert-selected ()
"Insert a link to the messages currently selected in Mail.app.
@@ -186,30 +189,41 @@ active mail in Mail.app and make a link out of it."
;; The following line is for backward compatibility
(defalias 'org-mac-message-insert-link 'org-mac-message-insert-selected)
-(defun org-mac-message-insert-flagged (org-buffer org-heading)
- "Asks for an org buffer and a heading within it, and replace message links.
+(eval-after-load "org-mac-message"
+ '(defun org-mac-message-insert-flagged (org-buffer org-heading)
+ "Asks for an org buffer and a heading within it, and replace message links.
If heading exists, delete all message:// links within heading's first
level. If heading doesn't exist, create it at point-max. Insert
list of message:// links to flagged mail after heading."
- (interactive "bBuffer in which to insert links: \nsHeading after which to insert links: ")
- (with-current-buffer org-buffer
- (goto-char (point-min))
- (let ((isearch-forward t)
- (message-re "\\[\\[\\(message:\\)\\([^]]+\\)\\]\\(\\[\\([^]]+\\)\\]\\)?\\]"))
- (if (org-goto-local-search-headings org-heading nil t)
- (if (not (eobp))
- (progn
- (save-excursion
- (while (re-search-forward
- message-re (save-excursion (outline-next-heading)) t)
- (delete-region (match-beginning 0) (match-end 0)))
- (insert "\n" (org-mac-message-get-links "f")))
- (flush-lines "^$" (point) (outline-next-heading)))
- (insert "\n" (org-mac-message-get-links "f")))
- (goto-char (point-max))
- (insert "\n")
- (org-insert-heading nil t)
- (insert org-heading "\n" (org-mac-message-get-links "f"))))))
+ (interactive "bBuffer in which to insert links: \nsHeading after which to insert links: ")
+ (with-current-buffer org-buffer
+ (goto-char (point-min))
+ (let ((isearch-forward t)
+ (message-re "\\[\\[\\(message:\\)\\([^]]+\\)\\]\\(\\[\\([^]]+\\)\\]\\)?\\]"))
+ (if (org-goto-local-search-headings org-heading nil t)
+ (if (not (eobp))
+ (progn
+ (save-excursion
+ ;; delete previously recorded flagged messages
+ (while (re-search-forward
+ message-re (save-excursion (outline-next-heading)) t)
+ (delete-region (match-beginning 0) (match-end 0)))
+ (insert "\n" (org-mac-message-get-links "f")))
+ ;; apparently also delete empty lines.
+ ;; allow for situation where there is no next-heading
+ ;; to avoid previously ocurring Lisp errors
+ (let (
+ (frm (point))
+ (tom (outline-next-heading)))
+ (if (null tom) (setq tom (point-max)))
+ (flush-lines "^$" frm tom)))
+
+ (insert "\n" (org-mac-message-get-links "f")))
+ (goto-char (point-max))
+ (insert "\n")
+ (org-insert-heading nil t)
+ (insert org-heading "\n" (org-mac-message-get-links "f"))))))
+ )
(provide 'org-mac-message)
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: mac-message for Growl 2
2013-08-04 20:39 mac-message for Growl 2 Iain Houston
@ 2013-08-31 14:07 ` Carsten Dominik
0 siblings, 0 replies; 2+ messages in thread
From: Carsten Dominik @ 2013-08-31 14:07 UTC (permalink / raw)
To: Iain Houston; +Cc: emacs-orgmode
Hi Iain,
org-mac-message has just been replaced by org-mac-link.
You you please re-evaluate if your problem still exists (probably yes - if so, please provide a new patch).
Thank you!
- Carsten
On 4.8.2013, at 22:39, Iain Houston <mail@iainhouston.me> wrote:
> I encountered a few problems with org-mac-mail bundled with emacs 24.3.1; some errors interfacing with Growl (2.1) so the patch below works for me and I wondered whether it would be of use to anyone else.
>
> I adapted the insertion of flagged mail to look at all active mail accounts rather than having to name any particular one.
>
> This is how I use org-mac-message: and below is the patch.
>
> (require 'org)
> (load "org-mac-message")
> (global-set-key [(shift f10)] (lambda() (interactive)
> (progn
> (find-file-noselect "~/Dropbox/org/refile.org")
> (org-mac-message-insert-flagged "refile.org" "Flagged mail"))))
>
>
> diff --git a/org-mac-message.el b/org-mac-message.el
> index 5df68f5..be2a654 100644
> --- a/org-mac-message.el
> +++ b/org-mac-message.el
> @@ -95,86 +95,89 @@ This will use the command `open' with the message URL."
> "return theLinkList as string\n"
> "end tell")))
>
> -(defun as-get-flagged-mail ()
> - "AppleScript to create links to flagged messages in Mail.app."
> - (do-applescript
> - (concat
> - ;; Is Growl installed?
> - "tell application \"System Events\"\n"
> - "set growlHelpers to the name of every process whose creator type contains \"GRRR\"\n"
> - "if (count of growlHelpers) > 0 then\n"
> - "set growlHelperApp to item 1 of growlHelpers\n"
> - "else\n"
> - "set growlHelperApp to \"\"\n"
> - "end if\n"
> - "end tell\n"
> -
> - ;; Get links
> - "tell application \"Mail\"\n"
> - "set theMailboxes to every mailbox of account \"" org-mac-mail-account "\"\n"
> - "set theLinkList to {}\n"
> - "repeat with aMailbox in theMailboxes\n"
> - "set theSelection to (every message in aMailbox whose flagged status = true)\n"
> - "repeat with theMessage in theSelection\n"
> - "set theID to message id of theMessage\n"
> - "set theSubject to subject of theMessage\n"
> - "set theLink to \"message://\" & theID & \"::split::\" & theSubject & \"\n\"\n"
> - "copy theLink to end of theLinkList\n"
> -
> - ;; Report progress through Growl
> - ;; This "double tell" idiom is described in detail at
> - ;; http://macscripter.net/viewtopic.php?id=24570 The
> - ;; script compiler needs static knowledge of the
> - ;; growlHelperApp. Hmm, since we're compiling
> - ;; on-the-fly here, this is likely to be way less
> - ;; portable than I'd hoped. It'll work when the name
> - ;; is still "GrowlHelperApp", though.
> - "if growlHelperApp is not \"\" then\n"
> - "tell application \"GrowlHelperApp\"\n"
> - "tell application growlHelperApp\n"
> - "set the allNotificationsList to {\"FlaggedMail\"}\n"
> - "set the enabledNotificationsList to allNotificationsList\n"
> - "register as application \"FlaggedMail\" all notifications allNotificationsList default notifications enabledNotificationsList icon of application \"Mail\"\n"
> - "notify with name \"FlaggedMail\" title \"Importing flagged message\" description theSubject application name \"FlaggedMail\"\n"
> - "end tell\n"
> - "end tell\n"
> - "end if\n"
> - "end repeat\n"
> - "end repeat\n"
> - "return theLinkList as string\n"
> - "end tell")))
> +(defun as-get-flagged-mail ()
> + "AppleScript to create links to flagged messages in all Mail.app accounts"
> + ;; Revised use of Growl interface and no need for variable org-mac-mail-account
> + (do-applescript
> + (concat
> + ;; Is Growl running? Use API as recommended at http://growl.info/documentation/applescript-support.php
> + "tell application \"System Events\"\n"
> + "set growlIsRunning to (count of (every process whose bundle identifier is \"com.Growl.GrowlHelperApp\")) > 0\n"
> + "end tell\n"
> +
> + "set theLinkList to {}\n"
> + "set isNotRegisteredToGrowl to true\n"
> + "tell application \"Mail\"\n"
> + "set theAccountList to the name of every account\n"
> + "repeat with theMailAccount in theAccountList\n"
> + "set theMailboxes to every mailbox of account theMailAccount\n"
> + "repeat with aMailbox in theMailboxes\n"
> + "set theSelection to (every message in aMailbox whose flagged status = true)\n"
> + "repeat with theMessage in theSelection\n"
> + "set theID to message id of theMessage\n"
> + "set theSubject to subject of theMessage\n"
> + "set theLink to \"message://\" & theID & \"::split::\" & theSubject & \"\n\"\n"
> + "copy theLink to end of theLinkList\n"
> +
> + "if growlIsRunning then\n"
> + "tell application id \"com.Growl.GrowlHelperApp\"\n"
> + "if isNotRegisteredToGrowl then\n"
> + "set the allNotificationsList to {\"FlaggedMail\"}\n"
> + "set the enabledNotificationsList to allNotificationsList\n"
> + "register as application \"FlaggedMail\" all notifications allNotificationsList default notifications enabledNotificationsList icon of application \"Mail\"\n"
> + "set isNotRegisteredToGrowl to false\n"
> + "end if\n"
> + "notify with name \"FlaggedMail\" title \"Importing flagged message\" description theSubject application name \"FlaggedMail\"\n"
> + "end tell\n"
> + "end if\n"
> +
> + "end repeat\n"
> + "end repeat\n"
> + "end repeat\n"
> + "end tell\n"
> + "return theLinkList as string\n"
> + ))
> + )
>
> (defun org-mac-message-get-links (&optional select-or-flag)
> - "Create links to the messages currently selected or flagged in Mail.app.
> + "Overridden function.
> +Create links to the messages currently selected or flagged in Mail.app.
> This will use AppleScript to get the message-id and the subject of the
> messages in Mail.app and make a link out of it.
> When SELECT-OR-FLAG is \"s\", get the selected messages (this is also
> the default). When SELECT-OR-FLAG is \"f\", get the flagged messages.
> The Org-syntax text will be pushed to the kill ring, and also returned."
> - (interactive "sLink to (s)elected or (f)lagged messages: ")
> - (setq select-or-flag (or select-or-flag "s"))
> - (message "AppleScript: searching mailboxes...")
> - (let* ((as-link-list
> - (if (string= select-or-flag "s")
> - (as-get-selected-mail)
> - (if (string= select-or-flag "f")
> - (as-get-flagged-mail)
> - (error "Please select \"s\" or \"f\""))))
> - (link-list
> - (mapcar
> - (lambda (x) (if (string-match "\\`\"\\(.*\\)\"\\'" x) (setq x (match-string 1 x))) x)
> - (split-string as-link-list "[\r\n]+")))
> - split-link URL description orglink orglink-insert rtn orglink-list)
> - (while link-list
> - (setq split-link (split-string (pop link-list) "::split::"))
> - (setq URL (car split-link))
> - (setq description (cadr split-link))
> - (when (not (string= URL ""))
> - (setq orglink (org-make-link-string URL description))
> - (push orglink orglink-list)))
> - (setq rtn (mapconcat 'identity orglink-list "\n"))
> - (kill-new rtn)
> - rtn))
> + (interactive "sLink to (s)elected or (f)lagged messages: ")
> + (setq select-or-flag (or select-or-flag "s"))
> + (let* ((as-link-list
> + (if (string= select-or-flag "s")
> + (progn
> + (message "AppleScript: searching mailboxes for selected message")
> + (as-get-selected-mail))
> + (if (string= select-or-flag "f")
> + (progn
> + ;; searching for all flagged messages can take tens of seconds
> + ;; so user needs to be told of progress even if Growl is also notifying
> + (message "AppleScript: searching mailboxes for flagged messages")
> + (as-get-flagged-mail))
> + (error "Please select \"s\" or \"f\""))))
> + (link-list
> + (mapcar
> + (lambda (x) (if (string-match "\\`\"\\(.*\\)\"\\'" x) (setq x (match-string 1 x))) x)
> + (split-string as-link-list "[\r\n]+")))
> + split-link URL description orglink orglink-insert rtn orglink-list)
> + (while link-list
> + (setq split-link (split-string (pop link-list) "::split::"))
> + (setq URL (car split-link))
> + (setq description (cadr split-link))
> + (when (not (string= URL ""))
> + (setq orglink (org-make-link-string URL description))
> + (push orglink orglink-list)))
> + (setq rtn (mapconcat 'identity orglink-list "\n"))
> + (kill-new rtn)
> + ;; "searching" message will remain in echo area until replaced
> + (message "AppleScript: finished searching mailboxes.")
> + rtn))
>
> (defun org-mac-message-insert-selected ()
> "Insert a link to the messages currently selected in Mail.app.
> @@ -186,30 +189,41 @@ active mail in Mail.app and make a link out of it."
> ;; The following line is for backward compatibility
> (defalias 'org-mac-message-insert-link 'org-mac-message-insert-selected)
>
> -(defun org-mac-message-insert-flagged (org-buffer org-heading)
> - "Asks for an org buffer and a heading within it, and replace message links.
> +(eval-after-load "org-mac-message"
> + '(defun org-mac-message-insert-flagged (org-buffer org-heading)
> + "Asks for an org buffer and a heading within it, and replace message links.
> If heading exists, delete all message:// links within heading's first
> level. If heading doesn't exist, create it at point-max. Insert
> list of message:// links to flagged mail after heading."
> - (interactive "bBuffer in which to insert links: \nsHeading after which to insert links: ")
> - (with-current-buffer org-buffer
> - (goto-char (point-min))
> - (let ((isearch-forward t)
> - (message-re "\\[\\[\\(message:\\)\\([^]]+\\)\\]\\(\\[\\([^]]+\\)\\]\\)?\\]"))
> - (if (org-goto-local-search-headings org-heading nil t)
> - (if (not (eobp))
> - (progn
> - (save-excursion
> - (while (re-search-forward
> - message-re (save-excursion (outline-next-heading)) t)
> - (delete-region (match-beginning 0) (match-end 0)))
> - (insert "\n" (org-mac-message-get-links "f")))
> - (flush-lines "^$" (point) (outline-next-heading)))
> - (insert "\n" (org-mac-message-get-links "f")))
> - (goto-char (point-max))
> - (insert "\n")
> - (org-insert-heading nil t)
> - (insert org-heading "\n" (org-mac-message-get-links "f"))))))
> + (interactive "bBuffer in which to insert links: \nsHeading after which to insert links: ")
> + (with-current-buffer org-buffer
> + (goto-char (point-min))
> + (let ((isearch-forward t)
> + (message-re "\\[\\[\\(message:\\)\\([^]]+\\)\\]\\(\\[\\([^]]+\\)\\]\\)?\\]"))
> + (if (org-goto-local-search-headings org-heading nil t)
> + (if (not (eobp))
> + (progn
> + (save-excursion
> + ;; delete previously recorded flagged messages
> + (while (re-search-forward
> + message-re (save-excursion (outline-next-heading)) t)
> + (delete-region (match-beginning 0) (match-end 0)))
> + (insert "\n" (org-mac-message-get-links "f")))
> + ;; apparently also delete empty lines.
> + ;; allow for situation where there is no next-heading
> + ;; to avoid previously ocurring Lisp errors
> + (let (
> + (frm (point))
> + (tom (outline-next-heading)))
> + (if (null tom) (setq tom (point-max)))
> + (flush-lines "^$" frm tom)))
> +
> + (insert "\n" (org-mac-message-get-links "f")))
> + (goto-char (point-max))
> + (insert "\n")
> + (org-insert-heading nil t)
> + (insert org-heading "\n" (org-mac-message-get-links "f"))))))
> + )
>
> (provide 'org-mac-message)
>
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-08-31 14:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-04 20:39 mac-message for Growl 2 Iain Houston
2013-08-31 14:07 ` Carsten Dominik
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).