I’ve been digging MailMate, but missing a function I’d added to my Doom Emacs setup that let me search mu4e for mails from a contact in my
contacts.org file. I set out to fix that this evening thinking it’d probably be an AppleScript thing, but it turns out MailMate has its own URL scheme (
mlmt:) that includes queries. From the command line, for instance, you’d just do something like
open mlmt:quicksearch?string="[email protected]" to search for that address.
(I learned about that from this post by James Sulak (another Emacs person, as it turns out), who shared a set of helpful Alfred workflows for working with MailMate.)
This function grabs the
open shell command:
(defun mph/open-mlmt-quicksearch () "Open a quicksearch URL for the email address at point." (interactive) (let ((email (org-entry-get (point) "EMAIL"))) (if (not (string-empty-p email)) (shell-command (format "open 'mlmt:quicksearch?string=%s'" email)) (message "No email address found"))))
MailMate search is very fast. The results are there in an eyeblink.
… and that sort of led to this, which searches Google Calendar for an email address from a contact:
(defun mph/open-gcal-search-for-email () "Open a Google Calendar search page for the email address at point." (interactive) (let ((email (org-entry-get (point) "EMAIL")) (search-url "https://calendar.google.com/calendar/u/0/r/search?q=%s")) (if (not (string-empty-p email)) (progn (message "Searching Google Calendar for events with email %s..." email) (browse-url (format search-url email))) (message "No email address found"))))
… and that suggested this one, which gets a date from the interactive org date picker and creates an all-day Google Calendar event with the contact as an invitee:
(defun mph/create-gcal-all-day-appointment-with-contact () "Create a new all-day appointment in Google Calendar and invite the contact at point." (interactive) (let* ((date (org-read-date nil t nil "Date: ")) (formatted-date (format-time-string "%Y%m%d" date)) (next-day (format-time-string "%Y%m%d" (time-add date (* 24 60 60)))) (contact-email (org-entry-get (point) "EMAIL")) (url (concat "https://calendar.google.com/calendar/u/0/r/eventedit?dates=" formatted-date "/" next-day "&pli=1&sf=true&action=TEMPLATE&add=" contact-email))) (browse-url url)))
I preferred just setting it to all-day, because I’ve learned a few things about scheduling time to catch up with people in a non-business context:
- It’s usually gonna be a few weeks out. PTO, busy, etc.
- Setting a day is pretty easy, but setting a good time can be hard when it’s that far out. Schedules do things, or we know a given day is usually our good day, but specifics can shift around.
- Setting an all-day item and a reminder to lock down the details several days out makes it easier to agree to something and work out the details when calendars are a little more clear. No constant shuffling if one party or the other isn’t in complete control of their own calendar.
I wonder if I should go read a book about how to stay in touch with people. I know there are several.