Emacs: commands in popup frames with 'emacsclient'
Raw link: https://www.youtube.com/watch?v=vbWxT8tht9A
In this 15-minute video I show the custom code I have to run any Emacs
command in a popup frame. The advantage of this is that I do not need
to be in Emacs already. The examples I show cover org-capture
and my
tmr
package.
This is the code I used in the video. Remember to assign the
emacsclient
calls to a system-level key binding.
;;;; Run commands in a popup frame
(defun prot-window-delete-popup-frame (&rest _)
"Kill selected selected frame if it has parameter `prot-window-popup-frame'.
Use this function via a hook."
(when (frame-parameter nil 'prot-window-popup-frame)
(delete-frame)))
(defmacro prot-window-define-with-popup-frame (command)
"Define interactive function which calls COMMAND in a new frame.
Make the new frame have the `prot-window-popup-frame' parameter."
`(defun ,(intern (format "prot-window-popup-%s" command)) ()
,(format "Run `%s' in a popup frame with `prot-window-popup-frame' parameter.
Also see `prot-window-delete-popup-frame'." command)
(interactive)
(let ((frame (make-frame '((prot-window-popup-frame . t)))))
(select-frame frame)
(switch-to-buffer " prot-window-hidden-buffer-for-popup-frame")
(condition-case nil
(call-interactively ',command)
((quit error user-error)
(delete-frame frame))))))
(declare-function org-capture "org-capture" (&optional goto keys))
(defvar org-capture-after-finalize-hook)
;;;###autoload (autoload 'prot-window-popup-org-capture "prot-window")
(prot-window-define-with-popup-frame org-capture)
(add-hook 'org-capture-after-finalize-hook #'prot-window-delete-popup-frame)
(declare-function tmr "tmr" (time &optional description acknowledgep))
(defvar tmr-timer-created-functions)
;;;###autoload (autoload 'prot-window-popup-tmr "prot-window")
(prot-window-define-with-popup-frame tmr)
(add-hook 'tmr-timer-created-functions #'prot-window-delete-popup-frame)
;;;; The emacsclient call depends on the daemon or `server-mode' (I use the latter)
(use-package server
:ensure nil
:defer 1
:config
(unless (server-running-p)
(server-start)))
;;;; The emacsclient calls that need ot be bound to system-wide keys
;; emacsclient -e '(prot-window-popup-org-capture)'
;; emacsclient -e '(prot-window-popup-tmr)'