EmacsConf backstage: jumping to and working with talks using Embark
| emacs, emacsconfIn the course of organizing and running EmacsConf, I often need to jump to or act on specific talks. I have a function that jumps to the talk heading so that I can look up additional information or add notes.
emacsconf-go-to-talk: Jump to the talk heading matching SEARCH.
(defun emacsconf-go-to-talk (search) "Jump to the talk heading matching SEARCH." (interactive (list (emacsconf-complete-talk))) (find-file emacsconf-org-file) (widen) (cond ((plist-get search :slug) (goto-char (org-find-property "SLUG" (plist-get search :slug)))) ((emacsconf-get-slug-from-string search) (goto-char (org-find-property "SLUG" (emacsconf-get-slug-from-string search)))) (t (goto-char (catch 'found (org-map-entries (lambda () (when (string-match search (cons (concat (org-entry-get (point) "SLUG") " - " (org-entry-get (point) "ITEM") " - " (org-entry-get (point) "NAME") " - " (org-entry-get (point) "EMAIL")) (point))) (throw 'found (point)))) "SLUG={.}"))))) (org-reveal))
Most of the work is done in a completion function that makes it easy to specify a talk using the slug (talk ID), title, or speaker names.
emacsconf-complete-talk: Offer talks for completion.
(defun emacsconf-complete-talk (&optional info) "Offer talks for completion. If INFO is specified, limit it to that list." (let ((choices (if (and (null info) emacsconf-complete-talk-cache) emacsconf-complete-talk-cache (mapcar (lambda (o) (string-join (delq nil (mapcar (lambda (f) (plist-get o f)) '(:slug :title :speakers :irc))) " - ")) (or info (emacsconf-get-talk-info)))))) (completing-read "Talk: " (lambda (string predicate action) (if (eq action 'metadata) '(metadata (category . emacsconf)) (complete-with-action action choices string predicate))))))
In addition to jumping to the Org heading for a talk, there are a bunch of other things I might want to do. Embark lets me add a bunch of shortcuts for working with a talk. I could open the caption file, edit the talk's wiki page, change a talk's property, e-mail the speaker, or more. Here's the Embark-related code from emacsconf.el:
Embark-related code
;;; Embark (defun emacsconf-embark-finder () "Identify when we're on a talk subtree." (when (and (derived-mode-p 'org-mode) (org-entry-get-with-inheritance "SLUG")) (cons 'emacsconf (org-entry-get-with-inheritance "SLUG")))) (defun emacsconf-insert-talk-title (search) "Insert the talk title matching SEARCH." (interactive (list (emacsconf-complete-talk))) (insert (plist-get (emacsconf-search-talk-info search) :title))) (with-eval-after-load 'embark (add-to-list 'embark-target-finders 'emacsconf-embark-finder) (defvar-keymap embark-emacsconf-actions :doc "Keymap for emacsconf-related things" "a" #'emacsconf-announce "c" #'emacsconf-find-captions-from-slug "d" #'emacsconf-find-caption-directives-from-slug "p" #'emacsconf-set-property-from-slug "w" #'emacsconf-edit-wiki-page "s" #'emacsconf-set-start-time-for-slug "W" #'emacsconf-browse-wiki-page "u" #'emacsconf-update-talk "t" #'emacsconf-insert-talk-title "m" #'emacsconf-mail-speaker-from-slug "n" #'emacsconf-notmuch-search-mail-from-entry "f" #'org-forward-heading-same-level "b" #'org-backward-heading-same-level "RET" #'emacsconf-go-to-talk) (add-to-list 'embark-keymap-alist '(emacsconf . embark-emacsconf-actions))) ;;; Status updates
For example, I sometimes need to open the wiki page for a talk in order to update the talk description.
emacsconf-edit-wiki-page: Open the wiki page for the talk matching SEARCH.
;;; Embark (defun emacsconf-embark-finder () "Identify when we're on a talk subtree." (when (and (derived-mode-p 'org-mode) (org-entry-get-with-inheritance "SLUG")) (cons 'emacsconf (org-entry-get-with-inheritance "SLUG"))))
Embark can also act on completion candidates, so I can call any of those actions from my C-c e t
shortcut for emacsconf-go-to-talk
. This is specified by the (metadata (category . emacsconf))
in emacsconf-complete-talk
and the (add-to-list 'embark-keymap-alist '(emacsconf . embark-emacsconf-actions))
in my Embark configuration.
C-.
is the embark-act
shortcut in my configuration. When I need to
remember what the shortcuts are, I can use C-h
(embark-keymap-help
) to list the keyboard shortcuts or select the command with completion.
The code above and related functions are in emacsconf.el or other files in the emacsconf-el repository.