Emacs Quick Capture

I like to use org-mode in Emacs; it is rather well described by its slogan, ‘your life in plain text’. When I am working in Emacs, which is quite often, my key bindings allow me to very easily take notes and add tasks to my agenda using org-capture, and then switch back to what I was doing. The following configuration allows me to access the same functionality quickly from outside Emacs.

In my Emacs configuration I have defined the following function:

(defun abs--quick-capture ()
       ;; redefine the function that splits the frame upon org-capture
       (defun abs--org-capture-place-template-dont-delete-windows (oldfun args)
         (cl-letf (((symbol-function 'org-switch-to-buffer-other-window) 'switch-to-buffer))
           (apply oldfun args)))

       ;; run-once hook to close window after capture
       (defun abs--delete-frame-after-capture ()
         (remove-hook 'org-capture-after-finalize-hook 'abs--delete-frame-after-capture)

       ;; set frame title
       (set-frame-name "emacs org capture")
       (add-hook 'org-capture-after-finalize-hook 'abs--delete-frame-after-capture)
       (abs--org-capture-place-template-dont-delete-windows 'org-capture nil)

The function sets the frame title to “emacs org capture” (so that my window manager will recognize it), opens org-capture and automatically closes the frame when I either cancel or finish the capture session. To open org-capture in a popup window from anywhere outside emacs, I have the following shell script in my path:


emacsclient -c -e "(abs--quick-capture)"

When run, the script opens a new Emacs frame (-c) and runs the function defined above, so that I can immediately capture whatever I have in mind.

Finally, my window manager, i3, is configured with a global shortcut (Mod4-c) to run the script and float the corresponding window:

bindsym $mod+c exec "/home/abel/bin/ecapture"

for_window [title="emacs org capture"] floating enable