As part of my workflow with org-agenda, I want a dedicated Emacs instance for it, which should pop up when invoked with a keystroke (similar to Guake).
I’m planning to have this for Linux and Windows, since I use both. However, so far I’ve only got the Linux version ready.
I’ve only tested this on i3, but I suspect it could easily be adapted to other window managers. The main pre-requisite is to have xdotool installed.
The setup is done in two parts:
- a shell script to toggle Emacs visibility; and
- the i3 configuration
The shell script launches Emacs (if it hasn’t been done yet), and then uses
xdotool to toggle its
#!/usr/bin/env bash NAME=emacs-org-agenda X=675 Y=250 # i3 is creating two windows with the same name, one being an "i3 # container". Is not meant to be unmaped, so I need to keep track of # the ID of the real one. WINDOW_ID_FILE=/tmp/emacs-org-agenda-window-id window_id=`xdotool search --onlyvisible --name $NAME || cat $WINDOW_ID_FILE` xdotool getwindowname $window_id if [ $? -ne 0 ]; then emacs --name $NAME --eval '(org-agenda nil "x")' -geometry +$X+$Y & exit fi echo $window_id > $WINDOW_ID_FILE xdotool search --onlyvisible --name $NAME windowunmap \ || xdotool windowmap $window_id windowmove $window_id $X $Y
In this case
(org-agenda nil "x") is the command that opens my agenda (
x is the key I have
org-agenda-custom-commands). I had to use
windowmap to avoid Emacs
to slowly drift to the left on every toggle.
The i3 configuration binds
F12 to the shell script, and sets the size and behavior of this instance
bindsym F12 exec --no-startup-id ~/src/dotfiles/scripts/toggle-emacs-org-agenda.sh for_window [instance="emacs-org-agenda"] floating enable for_window [instance="emacs-org-agenda"] border pixel 5 for_window [instance="emacs-org-agenda"] resize set 1024 800 for_window [instance="emacs-org-agenda"] sticky enable
I had to set the size with i3, doing it when launching Emacs with
-geometry didn’t work. When set
-geometry, the size would be set correctly at the beginning, but when Emacs got hidden for the
first time, it would be messed up (i.e. it would become a tiny tiny window).
Haven’t done this yet 🤭.